先添加权限
根据号码查询联系人姓名
查询data表,根据data1字段(因为联系人姓名已知 where data1 = phoneNumber),返回mimetype和_id字段
如果返回的cursor不为空 且cursor.getCount长度大于0,则遍历mimetype(0下标元素)和raw_contact_id(1下标元素).
在遍历时,如果mimetype与vnd.android.cursor.item/phone_v2相同(即数据类型是号码)<---------查询的是data表 但实际上查询的是view视图 所以mimetype返回的string 可以打印下看看--------------,则根据已获取的raw_contact_id查询姓名字段
如果返回的cursor不为空且长度大于0,则遍历name(0下标元素)
切记关闭这2个cursor
//根据号码查询联系人姓名 public void queryContact(String number){ //联系人涉及到两个表 Uri uri1 = Uri.parse("content://com.android.contacts/data"); Uri uri2 = Uri.parse("content://com.android.contacts/raw_contacts"); ContentResolver resolver = getContentResolver();// Cursor cursor = resolver.query(uri1 , new String[]{"mimetype","_id"}, "data1=?", new String[]{number}, null);//这一行有问题 按理不应该查询_id Cursor cursor = resolver.query(uri1 , new String[]{"mimetype","raw_contact_id"}, "data1=?", new String[]{number}, null); if(cursor != null && cursor.getCount() > 0){ while(cursor.moveToNext()){ String type = cursor.getString(0); int raw_contact_id = cursor.getInt(1); System.out.println(raw_contact_id); System.out.println(type); if("vnd.android.cursor.item/phone_v2".equals(type)){ Cursor cursor2 = resolver.query(uri2, new String[]{"display_name"}, "contact_id = ?", new String[]{String.valueOf(raw_contact_id)}, null); if(cursor2 != null && cursor2.getCount() > 0){ while(cursor2.moveToNext()){ String name = cursor2.getString(0); System.out.println(name); } cursor2.close(); } } } cursor.close(); }}
//根据姓名查询联系人号码 未判断如果是多号码的话出现的是哪一个 经测试 显示的是第2个号码 或者多号码的最后一个
查询raw_contacts表,根据display_name字段,返回contact_id字段
如果返回的cursor不为空,且长度大于0,则遍历contact_id(0下标元素)
在遍历时,根据取得的contact_id和mimetype(已经知道需要找号码,即mimetype表中vnd.android.cursor.item/phone_v2,其_id为5)来查询data1字段
如果返回的cursor不为空且长度大于0,则遍历data1(0下标元素)
切记关闭这2个cursor
//根据联系人姓名查号码 如果在数据库中不存在 那么返回的是空字符串 public void queryContactByName(String name){ //联系人涉及到两个表 Uri uri1 = Uri.parse("content://com.android.contacts/data");//data表的uri Uri uri2 = Uri.parse("content://com.android.contacts/raw_contacts");//raw_contacts表的uri ContentResolver resolver = getContentResolver(); Cursor cursor = resolver.query(uri2 , new String[]{"contact_id"}, "display_name=?", new String[]{name}, null); if(cursor != null && cursor.getCount() > 0){ while(cursor.moveToNext()){ String contact_id = cursor.getString(0); System.out.println("查询到的contact_id="+contact_id); Cursor cursor2 = resolver.query(uri1, new String[]{"data1"}, "contact_id = ?" + "and mimetype = ?", new String[]{String.valueOf(contact_id),"vnd.android.cursor.item/phone_v2"}, null); if(cursor2 != null && cursor2.getCount() > 0){ while(cursor2.moveToNext()){ String number = cursor2.getString(0); System.out.println(number); } cursor2.close(); } } cursor.close(); } }
这个类对根据姓名获取的电话号码进行了去除空格和“-”处理 因为在数据库里面的号码是以1 234-444-444的格式进行储存的
public class RemovePhoneNumberSpace { public static String getNormativePhoneNumber(String unNormativePhoneNumber) { String removeCharPhoneNumber = ""; if ( !"".equals(unNormativePhoneNumber)) { String removeSpacePhoneNumber = unNormativePhoneNumber.replaceAll(" ", ""); removeCharPhoneNumber = removeSpacePhoneNumber.replaceAll("-", ""); } return removeCharPhoneNumber; } }