0

Je passe le nom du compte d'une liste à cette méthode. Maintenant je veux savoir lequel de ces noms de compte sont lus seulement dans la table de contacts ainsi je n'itère le curseur qu'une fois pour obtenir l'identification de contact du curseur brut. Après avoir obtenu le contact_id, j'utilise le curseur du téléphone pour vérifier si l'identifiant donné est en lecture seule ou non mais je suis incapable de le faire. s'il vous plaît consulter ci-dessousComment obtenir les noms de compte en lecture seule de l'ID de contact dans Contacts dans Android

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); 


} 

Répondre

3

Vous ne devez pas aller sur les contacts d'un compte pour vérifier que vous pouvez simplement parcourir les SyncAdapters sur l'appareil, et vérifier leurs propriétés:

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); 
      } 
     } 
    } 
} 

J'espère que cela t'aides.

+0

Merci beaucoup. –

+0

Je voudrais également obtenir seulement le compte avec l'adaptateur de synchronisation ayant des contacts de téléphone seulement. –

+0

que voulez-vous dire par «avoir des contacts téléphoniques seulement»? vous voulez dire le compte de contacts spéciaux appelé "Téléphone seulement (non synchronisé)" si vous le faites, il n'a pas de SyncAdapter, parce que c'est un compte non synchronisé – marmor