You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 11:42:31