Android删除联系人恢复问题:无法获取联系人电话号码
解决已删除联系人无法获取电话号码的问题
我来帮你搞定这个问题!你现在能拿到已删除联系人的姓名,但电话号码一直是null,核心有两个关键错误需要修正:
问题1:关联ID取错了
你当前查询的是RawContacts.CONTENT_URI,但却试图获取ContactsContract.Contacts._ID字段——这个字段属于Contacts表,并不是RawContacts表的字段,所以你拿到的ID其实是无效的,自然查不到对应的电话数据。
你应该获取RawContacts表中的CONTACT_ID字段,它才是关联到联系人聚合ID的正确字段。
问题2:未筛选已删除的电话记录
已删除联系人的电话数据同样会被标记为DELETED=1,而默认的Phone.CONTENT_URI查询只会返回未删除的记录,所以必须在查询条件中加上这个筛选,才能拿到已删除的电话号码。
修改后的完整代码
public static final String WHERE_MODIFIED1 = "( "+ ContactsContract.RawContacts.DELETED + "=1)"; public void readContacts() { ContentResolver cr = getContentResolver(); Cursor cur = cr.query(ContactsContract.RawContacts.CONTENT_URI, null, WHERE_MODIFIED1, null, null); assert cur != null; if (cur.getCount() > 0) { while (cur.moveToNext()) { // 修正:获取RawContacts对应的联系人ID String contactId = cur.getString(cur.getColumnIndex(ContactsContract.RawContacts.CONTACT_ID)); String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); String phone = null; System.out.println("name : " + name + ", CONTACT_ID : " + contactId); // 修正:添加DELETED=1的条件,查询已删除的电话记录 String phoneSelection = ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? AND " + ContactsContract.Data.DELETED + " = 1"; Cursor pCur = cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, phoneSelection, new String[]{contactId}, null ); while (pCur.moveToNext()) { phone = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); System.out.println("phone: " + phone); } pCur.close(); if (phone != null) { contactList.add(new Contact(name, phone)); } Log.e("hvy", "onCreaterrView Phone Number: name = " + name + " No = " + phone); } } cur.close(); }
额外注意事项
- 确保你已经在Manifest中声明了
<uses-permission android:name="android.permission.READ_CONTACTS" />权限,并且在Android 6.0+版本中动态申请了该权限,否则会无法读取联系人数据。 - 部分厂商的系统可能会彻底删除已删除的联系人数据(而非仅标记),这种情况下可能无法恢复,但大部分原生Android系统和主流厂商会保留标记为删除的记录一段时间。
内容的提问来源于stack exchange,提问作者Syed Rafaqat Hussain
相关产品推荐
相关产品推荐

