6

ContactsContract でユーザー プロファイルを作成しようとしています...プロファイルがないため、テスト用にプロファイルが必要です。私は実際の Android デバイスを持っておらず、テスト用の AVD Emulator しか持っていません。

私が作業しているコードブロックは次のとおりです。

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

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, 0)
    .withValue(Data.MIMETYPE, Profile.CONTENT_RAW_CONTACTS_URI)
    .withValue(Profile.IS_USER_PROFILE, 1)
    .build()); 

ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
    .withValueBackReference(Data.RAW_CONTACT_ID, 0)
    .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
    .withValue(StructuredName.DISPLAY_NAME, name)
    .build());

this.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

このエントリをユーザー プロファイルにする行を削除すると、正常に機能します (つまり、名前が挿入されます)。ただし、IS_USER_PROFILE フラグを使用してエントリを設定する方法がわかりません。

アプリからユーザー プロファイルを作成できますか? もしそうなら、なぜこれがうまくいかないのかについてのアイデアはありますか?

どうもありがとう!スコット

4

3 に答える 3

3

@ozmankは良い指針を示しました - API レベル 15-23 をターゲットとするアプリから、より最新の動作例を追加することを考えました

この問題は、主にSamsungデバイスで発生しました。プロファイルが存在せず、プロファイルが存在する場合は削除できます。

  1. WRITE_PROFILEのuses-permissionをAndroidManifest.xml に追加します。

    <uses-permission android:name="android.permission.WRITE_PROFILE"/>
    
  2. プロファイルに属する空の未加工の連絡先を作成します - これにより、プロファイル エントリが生成されます

    ContentValues values = new ContentValues();            
    context.getContentResolver().insert(Profile.CONTENT_RAW_CONTACTS_URI, values);
    

返された URI から、未加工の連絡先エントリをクエリできます。

- これはプロファイルに情報を追加しないため、次を使用してプロファイルに情報を照会する場合

Uri uri = Uri.withAppendedPath(Profile.CONTENT_URI, Contacts.Data.CONTENT_DIRECTORY);
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);

結果カーソルは空になり、#2 のコードをもう一度実行して株式連絡先アプリに移動すると、Me プロファイルの下に複数の空のエントリが表示される可能性があります。新しい未加工の連絡先を作成する前に、できるだけクリーンアップして、作成した未加工の連絡先を追跡し、それがまだ有効かどうかを確認してください。

Uri uri = Uri.withAppendedPath(Profile.CONTENT_RAW_CONTACTS_URI, String.valueOf(lastLocalProfileManualRawId));
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);

if (cursor != null && cursor.getCount() > 0){
    // The profile exists
} else {
    // Create a new raw contact
}
于 2016-08-16T09:08:02.387 に答える
1

var 値 = 新しい ContentValues (); values.Put (ContactsContract.Contacts.InterfaceConsts.is_user_profile,"1"); ontentResolver.Update (ContactsContract.Profile.ContentRawContactsUri,values, null, null);

于 2013-01-24T08:38:16.340 に答える