从sms收件箱错误引用Contacts表

时间:2013-01-30 04:48:39

标签: android message android-contacts

我正在尝试从手机的短信收件箱中找到与短信相对应的联系方式。据我了解,person列是_id ContactsContract.Contacts列的外键。

我的问题是我从sms查询中获取了person值的错误值。联系表中不存在一些person ID,有些指向完全不同的联系人。

以下是我用于获取person值列表的代码,任何人都可以告诉我是否遗漏了某些内容或遇到类似问题。

使用运行Android 4.1.2的Nexus S进行测试

Uri parsedUri = Uri.parse("content://sms/inbox");
    String[] projection = new String[] { "_id", "address", "person" };
    Cursor cursor = contentResolver.query(parsedUri, projection, null, null, null);

    Log.d(TAG, "Total Count " + cursor.getCount());

    if (cursor.getCount() > 0) {
        // String address;
        int person;
        int personIndex = cursor.getColumnIndex("person");
        if (cursor.moveToFirst())
            do {
                person = cursor.getInt(personIndex);
                if (person > 0) {
                    // Add this id to a list
                }
            } while (cursor.moveToNext());
    }
    cursor.close();

更新:我正在查看Android Developer Portalhttp://developer.android.com/guide/topics/providers/contacts-provider.html)中的一些文档,是否有可能从短信收件箱中检索到的person ID是指{{ 1}}而不是像我一样ContactsContract.RawContacts

2 个答案:

答案 0 :(得分:5)

确实,短信收件箱中的人物栏指的是RawContacts条目的ID。通过查询RawContacts表,您可以找到特定用户的contact_id表的Contacts

您可以尝试使用此代码从RawContacts表中获取联系人ID ..

long contactId = 0;
Uri uri = ContactsContract.RawContacts.CONTENT_URI;
String[] projection = new String[] { ContactsContract.RawContacts._ID, ContactsContract.RawContacts.CONTACT_ID };
Cursor cursor = contentResolver.query(uri, projection, 
        ContactsContract.RawContacts._ID + " = ?",
        new String[] { rawContactId }, null);

if (cursor.moveToFirst()) {
    int contactIdIndex = cursor.getColumnIndex(ContactsContract.RawContacts.CONTACT_ID);
    contactId = cursor.getLong(contactIdIndex);
}
cursor.close();

这可以通过阅读Android中的短信行来解决您获取正确联系人详细信息的问题。然而,由于短信数据提供商没有记录,手机制造商可能会以不同方式使用它们,因此这种方法可能无法在除纯机器人之外的手机上使用。

答案 1 :(得分:0)

首先检查联系人列表中的人员号码是否已退出。如果是,则匹配两个ID。

Cursor cursor=managedQuery(uri, null, null, null, null);

                    while (cursor.moveToNext()) { 
                        String contactId = cursor.getString(cursor.getColumnIndex( 
                                ContactsContract.Contacts._ID)); 
                        String hasPhone = cursor.getString(cursor.getColumnIndex( 
                                ContactsContract.Contacts.HAS_PHONE_NUMBER)); 
                        if (Boolean.parseBoolean(hasPhone)) { 
                            // You know have the number so now query it like this
                            Cursor phones = getContentResolver().query( 
                                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
                                    null, 
                                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, 
                                    null, null); 
                            while (phones.moveToNext()) { 
                                String phoneNumber = phones.getString( 
                                        phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));              
                            } 
                            phones.close(); 
                        } 
                    }