1

Je veux lire les informations de contact du sélecteur de contact de construction. Je lis le numéro de téléphone, la rue, l'email et l'adresse. Il se trompe.Lire le numéro de téléphone avec l'adresse en utilisant Intent.ACTION_PICK

Voici le code à Invoke sélecteur de contact:

Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI); 
context.startActivityForResult(contactPickerIntent, REQUEST_ID_CONTACT_PICKER); 

Suite est le code de la méthode OnActivityResult, où je suis fetching contact informations du curseur:

Uri contactURI = intent.getData(); 
        Cursor cursor = activity.getContentResolver().query(contactURI, null, null, null, null); 
int count = cursor.getCount(); 
// here value of count is 1, so need to do cursor.moveToNext() to go to selected record. 
if (cursor.moveToNext()) { 
      String givenName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
      String familyName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME)); 
      String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME)); 
      String middleName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME)); 

      int contactType = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)); 
      String phoneNo = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
      String poBox = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX)); 
      String street = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET)); 
      String city = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY)); 
      String state = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION)); 
      String postalCode = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE)); 
      String country = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY)); 
      String neighborhood = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.NEIGHBORHOOD)); 
      String formattedAddress = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS)); 
      String emailId = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 

     } 

Je suis incapable d'identifier, pourquoi je reçois des données erronées (c'est-à-dire le numéro de contact) dans la colonne street, emailId etc.

ici cursor.moveToNext() est nécessaire pour aller au premier rang, il est donc nécessaire évidemment, et ma question est que je ne reçois autre dossier , je reçois numéro de téléphone mobile dans la rue, colonne emailId, qui est erroné.

Répondre

3

Après avoir perdu plus de 3 jours a trouvé le moyen de faire ce que je voulais:

Il y a un common structure pour stocker tout type de téléphone données par exemple, adresse, courrier électronique, etc. See the common columns names,

C'est pourquoi nous ne pouvons pas obtenir tous les types de données (contact, email, adresse etc) avec l'intention de sélecteur de contact, donc nous devons d'abord obtenir le contact Id ou contacter lookUpKey à la suite de l'intention du sélecteur de contact, que nous besoin d'interroger d'autres détails séparément. Le problème survient lorsque vous tentez d'extraire d'autres détails car chaque donnée est enregistrée dans la même structure de table, c'est-à-dire que la table générique peut contenir toutes sortes de données de contact.

Et le type de données stockées dans une ligne donnée est spécifié par la valeur MIMETYPE de la ligne, qui détermine la signification des colonnes génériques DATA1 à DATA15. Par exemple, si le type de données Mime est Phone.CONTENT_ITEM_TYPE, la colonne DATA1 stocke le numéro de téléphone , mais si le type de données Mime est Email.CONTENT_ITEM_TYPE, alors DATA1 stocke l'adresse électronique.

Donc, nous devons d'abord définir la clause where avec le type Mime avant d'interroger le tout type de contenu, consultez la liste des types MIME here

Voilà comment nous devrions tirer une intention de choisir le contact:

int REQUEST_ID_CONTACT_PICKER = 1001; 
Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI); 
startActivityForResult(contactPickerIntent, REQUEST_ID_CONTACT_PICKER); 

Que dans onActivityResult, nous obtenons l'URI des données:

public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    Contact contact = null; 
    if (resultCode == Activity.RESULT_OK) { 
     switch (requestCode) { 
     case REQUEST_ID_CONTACT_PICKER : 
      try { 
      Uri contactURI = intent.getData(); 
      contact = fetchAndBuildContact(getApplicationContext(), contactURI); 
      Log.d(LOG_TAG, "Pick contact sucessfully!!"+contact.toString()); 
      } 
      catch (Exception e) { 
      Log.e(LOG_TAG, "Failed to pick contact!!"); 
      e.printStackTrace(); 
      } 
      break; 
     } 
    } else { 
     Log.e(LOG_TAG, "Failed to pick contact!!"); 
    } 
    } 

Non, nous avons besoin de trouver le LookUpKey, ce qui est utile pour aller chercher tout type Mime de données:

private Contact fetchAndBuildContact(Context ctx, Uri uriContact){ 
     // Getting cursorLookUpKey because contacts ID may not be correct all the time. 
     Cursor cursorLookUpKey = ctx.getContentResolver().query(uriContact, new String[]{ContactsContract.Data.LOOKUP_KEY}, null, null, null); 
     Contact contact = null; 
     String lookupKey = null; 
     if (cursorLookUpKey.moveToFirst()) { 
      lookupKey = cursorLookUpKey.getString(cursorLookUpKey.getColumnIndex(ContactsContract.Data.LOOKUP_KEY)); 
      if(null != lookupKey){ 
       contact = new Contact(); 
       contact = buildConactPhoneDetails(lookupKey, ctx, contact); 
       contact = buildEmailDetails(lookupKey, ctx, contact); 
       contact = buildAddressDetails(lookupKey, ctx, contact); 
      } 
     } 
     cursorLookUpKey.close(); 
     return contact; 
    } 

Voilà comment nous pouvons récupérons Détails téléphone à l'aide ContactsContract.Data.MIMETYPE = ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE:

private Contact buildConactPhoneDetails(String lookupKey, Context ctx, final Contact contact) { 
     ContentResolver contentResolver = ctx.getContentResolver(); 
     String contactWhere = ContactsContract.Data.LOOKUP_KEY + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
     String[] contactWhereParams = new String[]{lookupKey, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE}; 
     Cursor cursorPhone = contentResolver.query(ContactsContract.Data.CONTENT_URI, null, contactWhere, contactWhereParams, null); 
     if (cursorPhone.getCount() > 0) { 
      if (cursorPhone.moveToNext()) { 
       if (Integer.parseInt(cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
        String givenName = cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
        String familyName = cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME)); 
        String middleName = cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME)); 
        int contactType = cursorPhone.getInt(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)); 
        String phoneNo = cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        contact.contactNumber = phoneNo; 
        contact.givenName = givenName; 
        contact.familyName = familyName; 
        contact.middleName = middleName; 
        contact.contactType = contactType; 
       } 
      } 
     } 
     cursorPhone.close(); 
     return contact; 
    } 

Ce comment nous peut aller chercher E-mail Détails en utilisant ContactsContract.Data.MIMETYPE = ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE:

private Contact buildEmailDetails (String lookupKey, Context ctx, final Contact contact) { 
     ContentResolver contentResolver = ctx.getContentResolver(); 
     String emailWhere = ContactsContract.Data.LOOKUP_KEY+ " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
     String[] emailWhereParams = new String[]{lookupKey, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE}; 
     Cursor emailCursor = contentResolver.query(ContactsContract.Data.CONTENT_URI, null, emailWhere, emailWhereParams, null); 
     if (emailCursor.moveToNext()) { 
      String emailId = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
      contact.emailId = emailId; 
     } 
     emailCursor.close(); 
     return contact; 
    } 

Voilà comment nous pouvons chercher PhoneDetails en utilisant ContactsContract.Data.MIMETYPE = ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE:

private Contact buildAddressDetails(String lookupKey, Context ctx, final Contact contact) { 
    ContentResolver contentResolver = ctx.getContentResolver(); 
    String addrWhere = ContactsContract.Data.LOOKUP_KEY + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
    String[] addrWhereParams = new String[]{lookupKey, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE}; 
    Cursor addrCursor = contentResolver.query(ContactsContract.Data.CONTENT_URI, null, addrWhere, addrWhereParams, null); 
    if (addrCursor.moveToNext()) { 
     String poBox = addrCursor.getString(addrCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX)); 
     String street = addrCursor.getString(addrCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET)); 
     String city = addrCursor.getString(addrCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY)); 
     String state = addrCursor.getString(addrCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION)); 
     String postalCode = addrCursor.getString(addrCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE)); 
     String country = addrCursor.getString(addrCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY)); 
     String neighborhood = addrCursor.getString(addrCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.NEIGHBORHOOD)); 
     String formattedAddress = addrCursor.getString(addrCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS)); 

     contact.poBox = poBox; 
     contact.street = street; 
     contact.city = city; 
     contact.state = state; 
     contact.zipcode = postalCode; 
     contact.country = country; 
     contact.street = street; 
     contact.neighborhood = neighborhood; 
     contact.poBox = poBox; 
     contact.formattedAddress = formattedAddress; 
    } 
    addrCursor.close(); 
    return contact; 
    } 

Et ceci est la classe POJO Contactez, nous créons dans le code ci-dessus:

public class Contact { 
    String country; 
    String poBox; 
    String givenName; 
    String middleName; 
    String familyName; 
    String address; 
    String city; 
    String state; 
    String street; 
    String zipcode; 
    String emailId; 
    String contactNumber; 
    String neighborhood; 
    String formattedAddress; 
    String label; 
    int contactType; 
} 
+0

Ceci est un beau morceau de code, merci pour le partage! Mérite beaucoup plus de votes upvotes. – azizbekian