4

新しい連絡先を作成したい場合、RAW_CONTACT_ID を設定する必要があると思います。そうでない場合、これらのコードはどのようにうまく機能しますか。私は正しいですか?そうでない場合、これらのデータが同じ連絡先に属していることをどのようにして知りましたか。はいの場合、RAW_CONTACT_ID を設定する方法は? たぶん、質問は次のように言えます: 存在しない新しい RAW_CONTACT_ID を取得するにはどうすればよいですか? 次に、コードを投稿します(RAW_CONTACT_IDに0を設定します):

    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

    ops.add(ContentProviderOperation
            .newInsert(ContactsContract.RawContacts.CONTENT_URI)
            .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
            .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
            .build());

    // ------------------------------------------------------ Names
    if (displayName != null) {
        ops.add(ContentProviderOperation
                .newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(
                        ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(
                        ContactsContract.Data.MIMETYPE,
                        ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                .withValue(
                        ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
                        displayName).build());
    }

    // ------------------------------------------------------ Mobile Number
    if (mobileNumber != null) {
        ops.add(ContentProviderOperation
                .newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(
                        ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(
                        ContactsContract.Data.MIMETYPE,
                        ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER,
                        mobileNumber)
                .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,
                        ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
                .build());
    }
    context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
4

3 に答える 3

2

以下のように int rawContactInsertIndex = ops.size() を使用する必要があります。

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(Data.CONTENT_URI).withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex).withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
                .withValue(StructuredName.DISPLAY_NAME, personalVcard.getFirstName()).build());
于 2012-10-30T07:31:36.300 に答える
0

以前のバージョンの Android で問題なく動作していたのと同じコードを使用して、JB で奇妙な問題を発見したと思います。同じベース名を共有する連絡先を作成するように依頼すると、作成が正常に行われず、 withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) によって返される生の連絡先 ID が同じように見えます。

たとえば、Contact1、Contact2、および Contact3 を作成してみてください。奇妙なことが始まります。ほとんどの場合、連絡先は表示されませんが、API を使用して連絡先を削除しようとすると、連絡先が実際に存在することが通知されます。

それが私の Jelly Bean プラットフォームを破壊した結果なのか、それとも Android ビルドでよくある問題なのかはわかりません。開発中のプラットフォームについて言及していることに注意してください。

たとえば、4.1.2でこれを見た人はいますか?

于 2012-12-10T17:20:20.697 に答える