Подтвердить что ты не робот

Каков тип/имя учетной записи по умолчанию для контактов в приложении для контактов Android?

Я хотел бы читать контакты из ContactContract API, который принадлежит только Phone/SIM, и хотел бы избежать контактов, синхронизированных с другими приложениями, такими как facebook и gmail. Я тестировал свой код на симуляторе, и он отлично работает, но на реальных устройствах он не возвращает никакого результата.

ContentResolver cr = AndroidContext.getContext()
                    .getContentResolver();
Cursor nativeContacts = cr.query(RawContacts.CONTENT_URI,
                    new String[] { RawContacts._ID, RawContacts.VERSION, RawContacts.CONTACT_ID },
                    RawContacts.DELETED + "<> 1 AND " + RawContacts.CONTACT_ID
                            + " IS NOT NULL AND " + RawContacts.ACCOUNT_NAME + " IS NULL AND "
                            + RawContacts.ACCOUNT_TYPE + " IS NULL", null, null);

Я думаю, что на устройствах тип учетной записи и имя для учетной записи по умолчанию не являются нулевыми, каково решение?

4b9b3361

Ответ 1

Я сделал то же самое, что и вы, и может предложить только два обхода:

  • Позвольте пользователю принять решение. Например, покажите ему список всех сырых контактов, а затем пусть он выберет, какой из них - контакт телефонной книги и сим-контакт.

  • Мой опыт работы с тремя различными устройствами заключается в том, что AccountManager не знает об учетной записи, используемой для хранения этих фоноконтактов. Например, когда вы извлекаете массив учетных записей из AccountManager, как вы это делали (AccountManager.getAccounts()), "com.htc.android.pcsc" отсутствует в списке! Но вы можете использовать именно этот факт в своих интересах: Исключить все известные типы/имена учетных записей, а список, который вы получите, должен быть списком всех контактов/контактов для телефонной книги.

Надеюсь, эти идеи помогли вам:) Я хотел бы прочитать ваши мысли об этих обходных решениях, в конце концов я пропустил что-то или есть еще более эффективный способ обхода.

Ответ 2

Я еще не нашел способ получить учетную запись SIM. Но я использую код ниже, чтобы получить имя и тип учетной записи по умолчанию.

public void getDefaultAccountNameAndType() {
    String accountType = "";
    String accountName = "";

    long rawContactId = 0;
    Uri rawContactUri = null;
    ContentProviderResult[] results = null;

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

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

    try {
        results = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
    } catch(Exception e) {
        e.printStackTrace();
    } finally {
        ops.clear();
    }

    for (ContentProviderResult result : results) {
        rawContactUri = result.uri;
        rawContactId = ContentUris.parseId(rawContactUri);
    }

    Cursor c = getContentResolver().query(
            RawContacts.CONTENT_URI
            , new String[] {RawContacts.ACCOUNT_TYPE, RawContacts.ACCOUNT_NAME}
            , RawContacts._ID+"=?"
            , new String[] {String.valueOf(rawContactId)}
            , null);

    if(c.moveToFirst()) {
        if(!c.isAfterLast()) {
            accountType = c.getString(c.getColumnIndex(RawContacts.ACCOUNT_TYPE));
            accountName = c.getString(c.getColumnIndex(RawContacts.ACCOUNT_NAME));
        }
    }

    getContentResolver().delete(rawContactUri, null, null);

    c.close();
    c = null;

    preference.setString("contactAccountType", accountType);
    preference.setString("contactAccountName", accountName);
}

Ответ 3

Я решил эту проблему.

Account[] accountList = AccountManager.get(this).getAccounts();

String accountSelection = "";
for(int i = 0 ; i < accountList.length ; i++) {
  if(accountSelection.length() != 0)
    accountSelection = accountSelection + " AND ";
  accountSelection = accountSelection + ContactsContract.Groups.ACCOUNT_TYPE + " != '" +  accountList[i].type + "'";
}