Telephony.Sms.Inbox.PERSON使用已弃用的Contacts.People._ID

bra*_*all 7 java android android-contentresolver contactscontract

赏金奖励 - 奖金将奖励给从填充Telephony.Sms.Inbox.PERSON值到相关Contact仅使用ContractsContact表格的答案.


我正在申请中以标准方式阅读短信:

    final String[] projection = {Telephony.Sms.Inbox.BODY,
            Telephony.Sms.Inbox.ADDRESS,
            Telephony.Sms.Inbox.READ,
            Telephony.Sms.Inbox.DATE,
            Telephony.Sms.Inbox.PERSON};

    final Cursor cursor = ctx.getContentResolver().query(Telephony.Sms.Inbox.CONTENT_URI,
            projection, null, null, Telephony.Sms.Inbox.DEFAULT_SORT_ORDER);
Run Code Online (Sandbox Code Playgroud)

填充时,从索引返回Telephony.Sms.Inbox.PERSON的id与弃用的id相关,Contacts.People._ID可用于通过以下方式查询更多联系人信息:

    final String[] projection = {Contacts.People.DISPLAY_NAME};
    final String[] selectionArgs = {contactId};

    final Cursor cursor = ctx.getContentResolver().query(Contacts.People.CONTENT_URI,
            projection, Contacts.People._ID + " = ?", selectionArgs, null);
Run Code Online (Sandbox Code Playgroud)

为什么相对较新的Telephony API使用弃用表而不是ContactsContract

Telephony.Sms.Inbox.PERSON文档说明:

类型:INTEGER(对内容中的项目的引用://联系人/人)

我试过(但并不奇怪吗?)在任何ContactsContractid字段中找到id的映射都没有成功,所以我不得不使用弃用的API来解决我需要快速执行的查询.

这样的查询包括搜索特定联系人的消息,我只有这个名字.联系人可能有多个号码,这些号码的格式可能不正确,无法匹配Telephony.Sms.Inbox.ADDRESS条目......

从数字到联系人时,使用和ContactsContract.PhoneLookup解决方法不是世界末日,但我仍然觉得我必须在这里遗漏一些东西Telephony.Sms.Inbox.ADDRESS

这是我用来获取"Joe Bloggs"消息的过程.

1)查询ContactsContract表以确认设备上存在Joe Bloggs名称的联系人 - 或者如果联系人实际列为"Joe 博客 ",则获得近似匹配.

2)使用确认的名称,我查询已弃用的Contact.People表以通过以下方式获取联系人的所有关联ID:

    final String selection = Contacts.People.DISPLAY_NAME + " LIKE ?";

    final String[] projection = {Contacts.People.DISPLAY_NAME,
            Contacts.People._ID};

    final String[] selectionArgs = {contactName};

    final Cursor cursor = ctx.getContentResolver().query(Contacts.People.CONTENT_URI,
            projection, selection, selectionArgs, null);
Run Code Online (Sandbox Code Playgroud)

3)使用已弃用的联系人ID列表,我查询消息表如下:

    final String[] referredArgs = new String[contactIdArray.size()];
    for (int i = 0; i < contactIdArray.size(); i++) {
        referredArgs[i] = contactIdArray.get(i);
    }

    final String referredSelection = Telephony.Sms.Inbox.PERSON + " IN "
            + "(" + TextUtils.join(",", referredArgs) + ")";

    final String[] projection = {Telephony.Sms.Inbox.BODY,
            Telephony.Sms.Inbox.ADDRESS,
            Telephony.Sms.Inbox.READ,
            Telephony.Sms.Inbox.DATE,
            Telephony.Sms.Inbox.PERSON};

    final Cursor cursor = ctx.getContentResolver().query(Telephony.Sms.Inbox.CONTENT_URI,
            projection, referredSelection, null, Telephony.Sms.Inbox.DEFAULT_SORT_ORDER);
Run Code Online (Sandbox Code Playgroud)

我希望有人会告诉我,我要绕过这里的房子,并且使用当前的API有一个更明显的解决方案.我不认为使用 优化的解决方案迭代整个消息表ContactsContract.PhoneLookup .

提前致谢.

小智 -1

我不明白你的担忧,但我正在从事类似的项目,这里是基本代码,以及用于获取和显示消息的基本、重要的列:

ContentResolver contentResolver = getContentResolver();
final String[] projection = new String[]{"*"};

Cursor SMSL = contentResolver.query(Telephony.Sms.CONTENT_URI, projection, null, null, "date ASC");
int msgscount = SMSL.getCount();

if (msgscount>0) {
msgs = new String[SMSL.getCount()][msgs_column_count];
    int i = 0;
    while (SMSL.moveToNext()) {
        progress.setProgress(i);

        msgs[i][0] = SMSL.getString(SMSL.getColumnIndex("address"));
        msgs[i][1] = SMSL.getString(SMSL.getColumnIndex("date_sent"));
        msgs[i][2] = SMSL.getString(SMSL.getColumnIndex("date"));
        msgs[i][3] = SMSL.getString(SMSL.getColumnIndex("type"));
        msgs[i][4] = SMSL.getString(SMSL.getColumnIndex("body"));
        msgs[i][5] = SMSL.getString(SMSL.getColumnIndex("read"));
        if (SMSL.getString(SMSL.getColumnIndex("service_center")) != null){
            msgs[i][6] = SMSL.getString(SMSL.getColumnIndex("service_center"));
        }else{
            msgs[i][6] = "";
        }
                    i++;
    }
    SMSL.close();
}else{
     msgs = new String[0][0];
     Toast.makeText(getApplicationContext(),"No messages found!",Toast.LENGTH_LONG).show();
}
Run Code Online (Sandbox Code Playgroud)

如果您需要任何帮助或获取消息,请告诉我。