1

私は現在、モバイルの連絡先にアクセスしたいプロジェクトに取り組んでいるので、なんとかアカウントを作成し、操作accountmanagerも実行できましたSyncadapter。モバイルでアカウントが作成されたことを確認できましたsettings->Accounts。ただし、以下のコードを使用して自分のアカウントですべての連絡先を取得しようとすると、機能しません。アプリ アカウントの連絡先を除くすべてのアプリ (google.com および WhatsApp.com) の連絡先が表示されます。

Cursor cursor = getContext().getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI,
        new String[]{ContactsContract.RawContacts.DIRTY, ContactsContract.RawContacts.ACCOUNT_TYPE},
        null,
        null,
        null);

if (cursor != null && cursor.getCount() >0) {
    cursor.moveToFirst();
    while(!cursor.isAfterLast()) {
        Log.d("Dirty",cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.DIRTY)));
        Log.d("ACCountType",cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE)));

        cursor.moveToNext();
    }
    cursor.close();
}

私が理解できないのは、自分のアカウントに代わってContentProviderすべての連絡先を作成して挿入する必要があるということですか?Contactsprovider

4

1 に答える 1

0

ContactsProvider の仕組みを完全に理解しているかどうかはわかりません。

知っておくべきことがいくつかあります。

  • すべての RawContact は、1 つの特定のアカウントに一意に割り当てられます。複数のアカウントに属することはできません (したがって、アプリは通常、既存の連絡先を同期できません。既にアカウントを持っているためです)。
  • すべてのアプリはすべての連絡先に対して同じビューを持ちます。特に、すべてのアプリはすべての連絡先を表示および変更できます (アクセス許可がある場合)。ただし、その規則にはいくつかの例外があります。
  • 連絡先をアカウントに同期するときは、 ContactsContract.RawContactsに示されているようにアカウントを指定する必要があります。

    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);
    
  • 連絡先を読み取ると、Uri クエリ パラメーターまたは選択を指定しない限り、すべてのアカウントの連絡先が取得されます。

    Uri rawContactUri = RawContacts.CONTENT_URI.buildUpon()
      .appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName)
      .appendQueryParameter(RawContacts.ACCOUNT_TYPE, accountType)
      .build();
    Cursor c1 = getContentResolver().query(rawContactUri,
      RawContacts.STARRED + "<>0", null, null, null)
    

    このクエリは、指定されたアカウントのスター付きの連絡先をすべて返します。

  • コードが同期アダプターとして動作する場合は、Uri クエリ パラメーターも追加する必要がありますCALLER_IS_SYNC_ADAPTER。そうしないと、多くの操作で異なる結果が得られる可能性があります。

于 2016-06-22T11:07:06.990 に答える