5

電話の SMS 受信トレイから SMS に対応する連絡先の詳細を見つけようとしています。私の理解では、列は の列personへの外部キーです。_idContactsContract.Contacts

私の問題はperson、SMS クエリからの値に対して間違った値を取得していることです。一部のpersonID は連絡先テーブルに存在せず、一部はまったく別の連絡先を指しています。

以下は、値のリストを取得するために使用するコードです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 Portal更新: ( http://developer.android.com/guide/topics/providers/contacts-provider.html )からいくつかのドキュメントを見ていましたpersonが、SMS 受信トレイから取得した ID が参照している可能性はありますか?私がしたようにContactsContract.RawContacts代わりにContactsContract.Contacts

4

2 に答える 2

5

実際、SMS 受信ボックスの person 列は、RawContactsエントリの ID を参照しています。テーブルにクエリ を実行すると、特定のユーザーのテーブルをRawContacts見つけることができます。contact_idContacts

このコードを試して、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 で SMS 行を読み取って正しい連絡先の詳細を取得するという問題が解決するはずです。ただし、SMS データ プロバイダーは文書化されておらず、電話メーカーによって使用方法が異なる可能性があるため、純粋な Android 以外の電話ではこのアプローチが機能しない可能性があります。

于 2013-01-31T06:40:58.597 に答える
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(); 
                        } 
                    }
于 2013-01-30T05:05:00.693 に答える