1

В настоящее время я работаю над проектом, в котором я хочу получить доступ к мобильным контактам. Поэтому мне удалось создать учетную запись с accountmanager, а также выполнить Syncadapter. Я мог видеть, что моя учетная запись была создана на мобильном устройстве settings->Accounts. Однако, когда я пытаюсь получить все контакты с моей учетной записью с помощью кода ниже, это не сработает. Он показывает все приложения (google.com и WhatsApp.com), кроме контактов с моими учетными записями.Нет контактов для учетной записи AccountManager

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 от имени моего счета?

ответ

0

Не уверен, что вы полностью поняли, как работает ContactsProvider.

Есть несколько вещей, которые вы должны знать:

  • Каждый RawContact однозначно отнесены к одному конкретному счету, он не может принадлежать более чем одной учетной записи (следовательно, ваше приложение, как правило, не может синхронизировать существующие контакты , потому что у них уже есть учетная запись).
  • Все приложения имеют одинаковое представление обо всех контактах, в частности, все приложения могут видеть и изменять все контакты (если у них есть разрешения), хотя есть несколько исключений из этого правила.
  • При синхронизации контактов на вашу учетную запись необходимо указать учетную запись, как показано на 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, иначе вы можете получить разные результаты для многих операций.

+0

Благодарим вас за ценное объяснение. В моем приложении я не создаю никаких действий, чтобы позволить пользователю вставлять контакт вручную, что означает, что когда мое приложение устанавливается первым, мое приложение должно читать все существующие контакты и повторно вставлять (с CALLER_IS_SYNC_ADAPTER) в таблицу rawcontacts на bahalf моей учетной записи , то я должен иметь возможность обнаруживать изменения и синхронизацию с сервером. Правильно ли я поступаю? – Naroju

+0

Зависит от того, что вы пытаетесь достичь. То, что вы описали, создаст копию каждого контакта. Проблема в том, что исходный контакт и ваша копия в конечном итоге не синхронизируются. Я предполагал, что вы создаете обычное приложение с двусторонней синхронизацией (в этом случае вам нужно вставлять контакты, даже без пользовательского интерфейса). – Marten

+0

Я предполагал, что вы создаете обычное приложение с двусторонней синхронизацией (в этом случае вам нужно вставлять контакты, даже без пользовательского интерфейса). Но это похоже на то, что вы планируете синхронизировать одностороннюю синхронизацию с устройством до вашего обслуживания, в основном соскабливая контакты. Это не поддерживается концепцией SyncAdapter. – Marten

Смежные вопросы