yyyyyyyyyyyyyyyyyyyy

博客园 首页 新随笔 联系 订阅 管理
  Android根据联系人姓名首字符顺序读取通讯录

本文给出了Android读取通讯录联系人的一般方法,且在读取Android通讯录联系人时候,将结果有序化(按照联系人姓名的首字符依次顺序读取:A ~ Z)。

读取的结果如图所示:

 

现给出实现该种Android通讯录读取的代码:

[java] view plain copy
 
  1. package zhangphil.contacts;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.app.ListActivity;  
  6. import android.content.ContentResolver;  
  7. import android.content.Context;  
  8. import android.database.Cursor;  
  9. import android.net.Uri;  
  10. import android.os.Bundle;  
  11. import android.provider.ContactsContract;  
  12. import android.view.LayoutInflater;  
  13. import android.view.View;  
  14. import android.view.ViewGroup;  
  15. import android.widget.ArrayAdapter;  
  16. import android.widget.ListView;  
  17. import android.widget.TextView;  
  18.   
  19. public class MainActivity extends ListActivity {  
  20.   
  21.     @Override  
  22.     protected void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.   
  25.         ArrayList<Contact> contacts = new ArrayList<Contact>();  
  26.         readContacts(contacts);  
  27.   
  28.         ListView listView = this.getListView();  
  29.         ArrayAdapter<Contact> adapter = new MyAdapter(this,  
  30.                 android.R.layout.simple_list_item_2, contacts);  
  31.         listView.setAdapter(adapter);  
  32.     }  
  33.   
  34.     private class MyAdapter extends ArrayAdapter<Contact> {  
  35.   
  36.         private int resource;  
  37.         private LayoutInflater inflater = null;  
  38.         private ArrayList<Contact> contacts;  
  39.   
  40.         public MyAdapter(Context context, int resource,  
  41.                 ArrayList<Contact> contacts) {  
  42.             super(context, resource);  
  43.             this.resource = resource;  
  44.             this.contacts = contacts;  
  45.   
  46.             inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  47.         }  
  48.   
  49.         @Override  
  50.         public View getView(int position, View convertView, ViewGroup parent) {  
  51.   
  52.             if (convertView == null)  
  53.                 convertView = inflater.inflate(resource, null);  
  54.   
  55.             Contact c = getItem(position);  
  56.   
  57.             TextView text1 = (TextView) convertView  
  58.                     .findViewById(android.R.id.text1);  
  59.             TextView text2 = (TextView) convertView  
  60.                     .findViewById(android.R.id.text2);  
  61.   
  62.             //首字符,分组的依据。  
  63.             text1.setText(c.firstLetterOfName());  
  64.               
  65.             //详情。  
  66.             text2.setText(c.name + " " + c.getPhoneNumbers());  
  67.   
  68.             return convertView;  
  69.         }  
  70.   
  71.         @Override  
  72.         public Contact getItem(int pos) {  
  73.             return contacts.get(pos);  
  74.         }  
  75.   
  76.         @Override  
  77.         public int getCount() {  
  78.             return contacts.size();  
  79.         }  
  80.     }  
  81.   
  82.     // 读取设备联系人的一般方法。大致流程就是这样,模板化的操作代码。  
  83.     private void readContacts(ArrayList<Contact> contacts) {  
  84.         Uri uri = Uri.parse("content://com.android.contacts/contacts");  
  85.         ContentResolver reslover = this.getContentResolver();  
  86.   
  87.         // 在这里我们给query传递进去一个SORT_KEY_PRIMARY。  
  88.         // 告诉ContentResolver获得的结果安装联系人名字的首字母有序排列。  
  89.         Cursor cursor = reslover.query(uri, null, null, null,  
  90.                 android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY);  
  91.   
  92.         while (cursor.moveToNext()) {  
  93.   
  94.             // 联系人ID  
  95.             String id = cursor  
  96.                     .getString(cursor  
  97.                             .getColumnIndex(android.provider.ContactsContract.Contacts._ID));  
  98.   
  99.             // Sort Key,读取的联系人按照姓名从 A->Z 排序分组。  
  100.             String sort_key_primary = cursor  
  101.                     .getString(cursor  
  102.                             .getColumnIndex(android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY));  
  103.   
  104.             // 获得联系人姓名  
  105.             String name = cursor  
  106.                     .getString(cursor  
  107.                             .getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME));  
  108.   
  109.             Contact mContact = new Contact();  
  110.             mContact.id = id;  
  111.             mContact.name = name;  
  112.             mContact.sort_key_primary = sort_key_primary;  
  113.   
  114.             // 获得联系人手机号码  
  115.             Cursor phone = reslover.query(  
  116.                     ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,  
  117.                     ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "="  
  118.                             + id, null, null);  
  119.   
  120.             // 取得电话号码(可能存在多个号码)  
  121.             // 因为同一个名字下,用户可能存有一个以上的号,  
  122.             // 遍历。  
  123.             ArrayList<String> phoneNumbers = new ArrayList<String>();  
  124.             while (phone.moveToNext()) {  
  125.                 int phoneFieldColumnIndex = phone  
  126.                         .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);  
  127.                 String phoneNumber = phone.getString(phoneFieldColumnIndex);  
  128.                 phoneNumbers.add(phoneNumber);  
  129.             }  
  130.   
  131.             mContact.phoneNumbers = phoneNumbers;  
  132.   
  133.             contacts.add(mContact);  
  134.         }  
  135.     }  
  136.   
  137.     // 用于装载从联系人数据库中读取到的数据。  
  138.     // 结构化数据,便于数据操作和访问。  
  139.     private class Contact {  
  140.         public String id;  
  141.         public String name;  
  142.         public String sort_key_primary;  
  143.         public ArrayList<String> phoneNumbers;  
  144.           
  145.         //获得一个联系人名字的首字符。  
  146.         //比如一个人的名字叫“安卓”,那么这个人联系人的首字符是:A。  
  147.         public  String  firstLetterOfName(){  
  148.             String s=sort_key_primary.charAt(0)+"";  
  149.             return  s.toUpperCase();  
  150.         }  
  151.   
  152.         public String getPhoneNumbers() {  
  153.             String phones = " ";  
  154.             for (int i = 0; i < phoneNumbers.size(); i++) {  
  155.                 phones += "号码" + i + ":" + phoneNumbers.get(i);  
  156.             }  
  157.   
  158.             return phones;  
  159.         }  
  160.     }  
  161. }  

 

不要忘记在项目的AndroidManifest.xml文件中添加Android读写通讯录联系人的权限:

 

[html] view plain copy
 
  1. <!-- 写权限 -->  
  2.    <uses-permission android:name="android.permission.WRITE_CONTACTS" />  
  3.    <!-- 读权限 -->  
  4.    <uses-permission android:name="android.permission.READ_CONTACTS" />  
posted on 2017-04-18 03:19  xxxxxxxx1x2xxxxxxx  阅读(595)  评论(0编辑  收藏  举报