如何从 Android 中联系人中的联系人 ID 获取只读帐户名称

How to get read only account names from contact id in Contacts in Android

我正在将列表中的帐户名称传递给此方法。现在我想知道这些帐户名称中的哪些在联系人 table 中是只读的,所以我只迭代游标一次以从原始游标获取联系人 ID。获得 contact_id 后,我正在使用 phone 游标来检查给定的 id 是否只读,但我无法这样做。请看下面

 private void displayAllContactsByType(String accountName) {

    Cursor rawCursor,phones = null;

    rawCursor = cResolver.query(
            ContactsContract.RawContacts.CONTENT_URI,
            new String[]{ContactsContract.RawContacts.CONTACT_ID},
            ContactsContract.RawContacts.ACCOUNT_NAME + "= ?",
            new String[]{accountName},
            null);


    int contactIdColumn = rawCursor.getColumnIndex(ContactsContract.RawContacts.CONTACT_ID);
    int rawCursorCount = rawCursor.getCount();


    Utils.Log("Account Name",  accountName);

    Utils.Log("Raw Size", " " + rawCursorCount);
    rawCursor.moveToFirst();
    Long contactId = rawCursor.getLong(contactIdColumn);


    phones = cResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
           null,
            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? AND "+ContactsContract.RawContacts.ACCOUNT_NAME + "= ?",
            new String[]{String.valueOf(contactId),accountName},
            null);

    phones.moveToFirst();




   String isReadOnly= phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.IS_READ_ONLY));
    Utils.Log("Raw Size", isReadOnly);


}

您不必查看帐户的联系人来进行检查,您可以简单地遍历设备上的 SyncAdapter,并检查它们的属性:

final SyncAdapterType[] syncs = ContentResolver.getSyncAdapterTypes();
for (SyncAdapterType sync : syncs) {
    Log.d(TAG, "found SyncAdapter: " + sync.accountType);
    if (ContactsContract.AUTHORITY.equals(sync.authority)) {
        Log.d(TAG, "SyncAdapter supports contacts: " + sync.accountType);
        boolean readOnly = !sync.supportsUploading();
        Log.d(TAG, "SyncAdapter read-only mode: " + readOnly);
        if (readOnly) {
            // we'll now get a list of all accounts under that accountType:
            Account[] accounts = AccountManager.get(this).getAccountsByType(sync.accountType);
            for (Account account : accounts) {
               Log.d(TAG, account.type + " / " + account.name);
            }
        }
    }
}

希望对您有所帮助。