1

Ich möchte Kontaktinformationen von Build Contact Picker lesen. Ich lese Telefonnummer, Straße, E-Mail und Adresse. Es kommt falsch.Lesen Sie die Telefonnummer zusammen mit der Adresse mit Intent.ACTION_PICK

Es folgt der Code invoke Kontakt Picker:

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

Im Folgenden finden Sie den Code des OnActivityResult Methode, wobei i fetching contact bin Infos von cursor:

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

     } 

vermag ich nicht zu erkennen, Warum bekomme ich falsche Daten (dh Kontaktnummer) in der Straße, EmailId usw. Spalte.

Hier cursor.moveToNext(), um erste Reihe zu gehen erforderlich ist, so ist es offensichtlich erforderlich, und meine Frage ist nicht, dass ich verschiedenen Rekord bin immer, ich in der Straße Handynummer immer bin, EMAILID Spalte, was ist falsch.

Antwort

3

Nach verschwenden mehr als 3 Tage fanden den Weg zu tun, was ich wollte:

Es wird ein common structure ist für alle Arten von Daten, dh Telefon speichern, Adresse, E-Mail usw. See the common columns names,

Deshalb können wir nicht alle Arten von Daten (Kontakt, E-Mail, Adresse usw.) mit Kontakt Picker Intent, also zuerst müssen wir den Kontakt Id erhalten oder Kontakt LookUpKey als Ergebnis von Contact Picker Intent, als wir müssen andere Details separat abfragen.

Aber das Problem kommt, wenn versuchen, andere Details zu holen, weil jeder Daten in derselben Tabellenstruktur gespeichert wird, das heißt allgemeine Tabelle, die jede Art von Kontakt-Daten aufnehmen kann. Die Art der Daten, die in einer bestimmten Zeile gespeichert sind, wird durch den MIMETYPE-Wert der Zeile angegeben, der die Bedeutung der generischen Spalten DATA1 bis DATA15 bestimmt. Wenn der Datenmime-Typ beispielsweise Phone.CONTENT_ITEM_TYPE ist, speichert die Spalte DATA1 die Telefonnummer , aber wenn der Datenmime-Typ Email.CONTENT_ITEM_TYPE lautet, speichert DATA1 die E-Mail-Adresse.

Also zuerst müssen wir where-Klausel mit Mime-Typ festlegen, bevor die jede Art von Inhalt Abfrage finden Sie in der Liste der MIME-Typen here

Dies ist, wie wir eine Absicht, den Kontakt zu wählen Feuers sollten:

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

als in onActivityResult, erhalten wir die URI in Daten:

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

Nicht brauchen wir die LookUpKey zu finden, die jeden Mime-Typ von Daten zu holen hilfreich:

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

Dies ist, wie wir Telefon-Details mit ContactsContract.Data.MIMETYPE = ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE holen kann:

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

Dies ist, wie wir können E-Mail Details mit ContactsContract.Data.MIMETYPE = ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE holen:

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

Dies ist, wie wir PhoneDetails ContactsContract.Data.MIMETYPE = ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE mit holen können:

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

Und der Kontakt POJO Klasse schaffen wir oben Code in:

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

Dies ist ein schönes Stück Code, vielen Dank für das Teilen! Verdient viel mehr Upvotes. – azizbekian