web-dev-qa-db-ja.com

Android 2.2に連絡先を挿入する

新しいRawContact連絡先を挿入しようとしていますが、連絡先または電話帳で連絡先を表示すると、追加されたRawContactが表示されません。 RawContactを作成し、それに関連付けられた連絡先がない場合、連絡先は自動的に挿入されます。 rawContactIdの有効な値を取得し、例外はスローされないため、挿入は成功したと思います。私は何か間違ったことをしていますか、それとも何かが足りませんか?開発者サイトのコード例を使用して、ここに貼り付けています。

 ContentValues values = new ContentValues();
 values.put(RawContacts.ACCOUNT_TYPE, accountType); 
 values.put(RawContacts.ACCOUNT_NAME, accountName);
 Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values); 
 long rawContactId = ContentUris.parseId(rawContactUri); 

 values.clear(); 
 values.put(Data.RAW_CONTACT_ID, rawContactId); 
 values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 
 values.put(StructuredName.DISPLAY_NAME, "Mike Sullivan"); 
 getContentResolver().insert(Data.CONTENT_URI, values); 
27
Alok Save

このQはずっと忘れられていたと思いましたが、誰かが賛成したので、他の誰かも私と同じ問題に直面していると思います。少し苦労した後、問題を見つけて連絡先を挿入することができました。これがお役に立てば幸いです。サンプルコードは次のとおりです。

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
int rawContactInsertIndex = ops.size();

ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
   .withValue(RawContacts.ACCOUNT_TYPE, null)
   .withValue(RawContacts.ACCOUNT_NAME,null )
   .build());
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
   .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
   .withValue(Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE)
   .withValue(Phone.NUMBER, "9X-XXXXXXXXX")
   .build());
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
   .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
   .withValue(Data.MIMETYPE,StructuredName.CONTENT_ITEM_TYPE)
   .withValue(StructuredName.DISPLAY_NAME, "Mike Sullivan")
   .build());  
ContentProviderResult[] res = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
37
Alok Save

クライアントから、上記の回答(Alsによる)のソリューションが一部のHTCデバイスで機能しないと報告されました。それで、数日間の欲求不満の後、私はこの解決策を思いつきました:

String name = "First Family";
String phone = "0123456789";
ContentValues values = new ContentValues();
values.put(Data.DISPLAY_NAME, name);
Uri rawContactUri = c.getContentResolver().insert(RawContacts.CONTENT_URI, values);
long rawContactId = ContentUris.parseId(rawContactUri);
long contactId = Util.getContactId(c, rawContactId);
System.out.println("rawContactId = " + rawContactId);
System.out.println("contactId = " + contactId);

values.clear();
values.put(Phone.NUMBER, phone);
values.put(Phone.TYPE, Phone.TYPE_OTHER);
values.put(Phone.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Data.RAW_CONTACT_ID, rawContactId);
c.getContentResolver().insert(Data.CONTENT_URI, values);

values.clear();
values.put(Data.MIMETYPE, Data.CONTENT_TYPE);
values.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name);
values.put(Data.RAW_CONTACT_ID, rawContactId);
c.getContentResolver().insert(Data.CONTENT_URI, values);

values.clear();
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
values.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name);
values.put(Data.RAW_CONTACT_ID, rawContactId);
c.getContentResolver().insert(Data.CONTENT_URI, values);



public static long getContactId(Context context, long rawContactId) {
    Cursor cur = null;
    try {
        cur = context.getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, new String[] { ContactsContract.RawContacts.CONTACT_ID }, ContactsContract.RawContacts._ID + "=" + rawContactId, null, null);
        if (cur.moveToFirst()) {
            return cur.getLong(cur.getColumnIndex(ContactsContract.RawContacts.CONTACT_ID));
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (cur != null) {
            cur.close();
        }
    }
    return -1l;
}
6
Milan

表示可能な連絡先を作成するには、表示可能なグループに属している必要があります。グループと可視性を表示するには、コンピューターのGmailの連絡先を確認してください。

デバイスで表示されているグループを見つけるには、次のようにします。

    Long myContactsGroupId = null;
    sqlWhere = ContactsContract.Groups.ACCOUNT_TYPE + " = 'com.google'  AND  " + ContactsContract.Groups.GROUP_VISIBLE + " = 1";
    Cursor cursor = getContentResolver().query(ContactsContract.Groups.CONTENT_URI, new String[] {"_id"}, sqlWhere, null, "_id");
    if (cursor.moveToFirst()) {
        myContactsGroupId = cursor.getLong(0);
    }

グループをrawContactに追加するには:

        cv.clear();
        cv.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE);
        cv.put(ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID, myContactsGroupId);
        cv.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
        getContentResolver().insert(ContactsContract.Data.CONTENT_URI, cv);

またはopsバージョン:

         ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE,
                        ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID, myContactsGroupId)
                .build());

@ anqe1ki11er:

私はあなたの答えの3番目の段落がそれが言うところを理解していません:

values.put(Data.MIMETYPE、Data.CONTENT_TYPE).。

そのようなMIMETYPEはありません。 (HTC Android 2.2)を実行しているHTCDesireで確認しました。

ありがとう。

1
OferR