Каков тип/имя учетной записи по умолчанию для контактов в приложении для контактов 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);
Я думаю, что на устройствах тип учетной записи и имя для учетной записи по умолчанию не являются нулевыми, каково решение?
Ответы
Ответ 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 + "'";
}