Android读取手机通讯录实现

爪哇米工作室 陈跃峰

出自:http://blog.csdn.net/mailbomb

说明:转载请注明出处

 

         在Android开发中,读取手机通讯录中的号码是一种基本操作,但是由于Android的版本众多,所以手机通讯录操作的代码比较纷杂,在本文中进行一下总结。

         Android1.5是现在的Android系统中最低的版本,首先来说一下适用于Android1.5及以上版本(含2.X,3.X)的代码实现:

                   //获得所有的联系人  

       Cursor cur = context.getContentResolver().query(  

               Contacts.People.CONTENT_URI,  

                null,  

                null,  

                null,  

                Contacts.People.DISPLAY_NAME +" COLLATE LOCALIZED ASC");  

       // 循环遍历  

       if (cur.moveToFirst()) {

           int idColumn = cur.getColumnIndex(Contacts.People._ID);  

           int displayNameColumn = cur.getColumnIndex(Contacts.People.DISPLAY_NAME);  

           do {  

                // 获得联系人的ID号  

                String contactId =cur.getString(idColumn); 

               

                // 获得联系人姓名  

                String disPlayName =cur.getString(displayNameColumn);  

                

                                     //获取联系人的电话号码

                                     CursorphonesCur = context.getContentResolver().query(  

                                                        Contacts.Phones.CONTENT_URI,null,  

                                                        Contacts.Phones.PERSON_ID+ "=" + contactId, null, null);

                           if (phonesCur.moveToFirst()) {  

                               do {  

                                   // 遍历所有的电话号码  

                                        StringphoneType = phonesCur.getString(phonesCur  

                                           .getColumnIndex(Contacts.PhonesColumns.TYPE));

                                   String phoneNumber =phonesCur.getString(phonesCur  

                                           .getColumnIndex(Contacts.PhonesColumns.NUMBER));  

                                         //自己的逻辑处理代码

                               }while(phonesCur.moveToNext());  

                           }

           }while (cur.moveToNext());

}

cur.close();

         使用这段代码可以在各种版本的Android手机中读取手机通讯录中的电话号码,而且可以读取一个姓名下的多个号码,但是由于使用该代码在2.x版本中的效率不高,读取的时间会稍长一些,而且2.x现在是Android系统的主流,至少占有80%以上的Android手机份额,所以可以使用高版本的API进行高效的读取。

         适用于Android2.0及以上版本的读取通讯录的代码如下:

                   //读取手机本地的电话

              ContentResolver cr =context.getContentResolver();

              //取得电话本中开始一项的光标,必须先moveToNext()

              Cursor cursor =cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);

              while(cursor.moveToNext()){

                  //取得联系人的名字索引

                  int nameIndex  =cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME);

                  String name = cursor.getString(nameIndex);

                  //取得联系人的ID索引值

                  String contactId =cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

                  //查询该位联系人的电话号码,类似的可以查询email,photo

                  Cursor phone =cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,

                                     ContactsContract.CommonDataKinds.Phone.CONTACT_ID+ " = " 

                          + contactId, null, null);//第一个参数是确定查询电话号,第三个参数是查询具体某个人的过滤值

                  //一个人可能有几个号码

                  while(phone.moveToNext()){

                      String phoneNumber =phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                      listName.add(name);

                      listPhone.add(phoneNumber);

                  }

                  phone.close();

              }

              cursor.close();

         如果需要读取SIM卡里面的通讯录内容,则可以使用:”content://icc/adn”进行读取,代码如下:

                   try{

                 Intent intent = new Intent();

                 intent.setData(Uri.parse(“content://icc/adn”));

                 Uri uri = intent.getData();

                      ContentResolvercr = context.getContentResolver();

                 Cursor cursor =context.getContentResolver().query(uri, null, null, null, null);

                 if (cursor != null) {

                          while(cursor.moveToNext()){

                       //取得联系人的名字索引

                       int nameIndex  = cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME);

                       String name = cursor.getString(nameIndex);

                       //取得联系人的ID索引值

                       String contactId =cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

                       //查询该位联系人的电话号码,类似的可以查询email,photo

                       Cursor phone =cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,

                                          ContactsContract.CommonDataKinds.Phone.CONTACT_ID+ " = " 

                               + contactId, null, null);//第一个参数是确定查询电话号,第三个参数是查询具体某个人的过滤值

                       //一个人可能有几个号码

                       while(phone.moveToNext()){

                           String phoneNumber =phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                           //自己的逻辑代码

                       }

                       phone.close();

                   }

                   cursor.close();

                 }

             }catch(Exception e){}

 

希望对大家有所帮助!

更多相关文章

  1. 读取android手机流量信息
  2. android EditText设置不可写
  3. android 使用html5作布局文件: webview跟javascript交互
  4. android studio调试c/c++代码
  5. IM-A820L限制GSM,WCDMA上网的原理(其他泛泰机型可参考)7.13
  6. 锁屏界面
  7. android(NDK+JNI)---Eclipse+CDT+gdb调试android ndk程序
  8. Android(安卓)version and Linux Kernel version
  9. android拍照与读取相册

随机推荐

  1. OpenGL ES 学习笔记(一)
  2. Android(安卓)录音
  3. android android.bat批处理
  4. 使用adb签名并安装Android程序
  5. android wearable 研究
  6. Android(安卓)Audio延迟(latency)
  7. Spring开始关注移动应用开发,发布Spring M
  8. 【总结备用】Android监听网络状态实现(Br
  9. Android主流Router库对比(ARouter、Activi
  10. Android之用户定位(三)