为了在拨号的时候能够实时显示所有可能匹配的联系人(实际上没什么用,如果记住了号码那比去通讯录中找要快多了),首先写出一个获取系统的Contacts的ContentProvider的方法,我查找所有联系人的姓名和电话号码的方法如下:
1 void search(){ 2 ContentResolver cr = getContentResolver(); 3 4 String[] projection = new String[]{ 5 ContactsContract.Contacts._ID 6 }; 7 8 Cursor idCursor = cr.query(ContactsContract.Contacts.CONTENT_URI,projection,null,null,null); 9 10 String id; 11 while(idCursor.moveToNext()){ 12 int idIdx = idCursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID); 13 id=idCursor.getString(idIdx); 14 printContacts(id); 15 } 16 17 idCursor.close(); 18 } 19 20 void printContacts(String id){ 21 if(id!=null){ 22 String where = ContactsContract.Data.CONTACT_ID+" = "+id +" AND "+ ContactsContract.Data.MIMETYPE+" = ‘"+ ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE+"‘"; 23 24 String[] projection = new String[]{ 25 ContactsContract.Data.DISPLAY_NAME, 26 ContactsContract.CommonDataKinds.Phone.NUMBER 27 }; 28 29 Cursor dataCursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI,projection,where,null,null); 30 31 int nameIdx = dataCursor.getColumnIndexOrThrow(ContactsContract.Data.DISPLAY_NAME); 32 int phoneIdx = dataCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER); 33 34 String[] result = new String[dataCursor.getCount()]; 35 36 while(dataCursor.moveToNext()){ 37 String name = dataCursor.getString(nameIdx); 38 String number = dataCursor.getString(phoneIdx); 39 number = number.replaceAll(" +", ""); 40 result[dataCursor.getPosition()] = name +" {"+number+"}"; 41 } 42 43 dataCursor.close(); 44 45 for(String item : result){ 46 Log.i("TAG",item); 47 } 48 } 49 }
以上代码来自Android 4高级编程。
总体过程就是通过查询到每个联系人信息的ID,然后通过另一个查询查询与此程序关联的联系人信息。
还可以获取联系人的头像缩略图,只需要在projection中加入:
String[] projection = new String[]{ ContactsContract.Data.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.Data.PHOTO_THUMBNAIL_URI };
最后那个条件,然后正常获取String类型的ImageURI即可:
int nameIdx = dataCursor.getColumnIndexOrThrow(ContactsContract.Data.DISPLAY_NAME); int phoneIdx = dataCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER); int thumbnail = dataCursor.getColumnIndexOrThrow(ContactsContract.Data.PHOTO_THUMBNAIL_URI); String[] result = new String[dataCursor.getCount()]; while(dataCursor.moveToNext()) { String name = dataCursor.getString(nameIdx); String number = dataCursor.getString(phoneIdx); String thumb = dataCursor.getString(thumbnail); number = number.replaceAll(" +", ""); result[dataCursor.getPosition()] = name + " {" + number + "} , " + thumb; }
通过ImageView的setImageURI()方法可以直接使用本地图片URI,如:
imageView.setImageURI(Uri.parse(thumb));
涉及隐私,这里就不再显示我的手机上的测试结果。
下一步计划是分离查询结果,在拨号界面中用ListView显示出来。
时间: 2024-09-28 20:59:45