1

Ich möchte den Kontaktnamen aus der Kontakt-E-Mail abrufen, also was ich getan habe, ist wie folgt von https://stackoverflow.com/a/18064869/5738881.NULL-Wert beim Abrufen des KONTAKTNAMENS von KONTAKT E-MAIL erhalten

public static String readContacts(Context context, String email) { 
    ContentResolver cr = context.getContentResolver(); 
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(email)); 
    Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null); 
    if (cursor == null) { 
     return null; 
    } 
    String contactName = null; 
    if (cursor.moveToFirst()) { 
     contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); 
    } 

    if (!cursor.isClosed()) { 
     cursor.close(); 
    } 

    Log.e("....contact name....", email + "\n" + contactName); 

    return contactName; 

} 

dann in onCreate(), I als codierte haben

sName = readContacts(getApplicationContext(), sEmail); 

    etName.setText(sName); 

Aber ich bin immer den Nullwert. Also, was könnte die Lösung sein, um den Kontaktnamen zu bekommen, abhängig von der Kontaktadresse?

EDIT-1:

Ich habe bereits erwähnt, die Erlaubnis in manifest wie

<uses-permission android:name="android.permission.READ_CONTACTS"/> 

EDIT-2:

Per ROHIT SHARMA Antwort, habe ich meinen Code wie folgt geändert.

public static String readContacts(Context context, String email) { 
    ContentResolver cr = context.getContentResolver(); 
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(email)); 
    Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null); 
    if (cursor == null) { 
     return null; 
    } 
    String contactName = null; 

    if (cursor.getCount() > 0) { 
     cursor.moveToFirst(); 

    } else { 
     return null; 
    } 

    if (cursor.moveToFirst()) { 
     contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); 
    } 

    if (!cursor.isClosed()) { 
     cursor.close(); 
    } 

    Log.e("....contact name....", email + "\n" + contactName); 

    return contactName; 

} 

Aber es hat mir auch nicht geholfen.

EDIT-3:

Es hat mir nicht so gut helfen.

EDIT-4:

Ich versuchte

public String readContacts(Context context, String email) { 

    String name = null; 

    // define the columns I want the query to return 
    String[] projection = new String[]{ 
      ContactsContract.PhoneLookup.DISPLAY_NAME, 
      ContactsContract.PhoneLookup._ID}; 

    // encode the email and build the filter URI 
    Uri contactUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(email)); 

    // query time 
    Cursor cursor = context.getContentResolver().query(contactUri, projection, null, null, null); 

    if (cursor != null) { 
     if (cursor.moveToFirst()) { 
      name = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); 
      Log.e("....email.....", "Started uploadcontactphoto: Contact Found @ " + email); 
      Log.e("....name....", "Started uploadcontactphoto: Contact name = " + name); 
     } else { 
      Log.e("....email exception....", "Contact Not Found @ " + email); 
     } 
     cursor.close(); 
    } 
    return name; 

} 

von https://stackoverflow.com/a/15007980/5738881 aber auch nicht helfen.

Hat jemand einen anderen Ausweg?

EDIT-5:

public String readContacts() { 

    ContentResolver cr = getContentResolver(); 

    @SuppressLint("Recycle") 

    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, 
      null, null, null, null); 

    String id, name = null, email = null; 

    if (cur != null && cur.getCount() > 0) { 
     while (cur.moveToNext()) { 
      id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
      name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
      if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
       System.out.println("name : " + name + ", ID : " + id); 

       // get the phone number 
       Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
         ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", 
         new String[]{id}, null); 
       if (pCur != null) { 
        while (pCur.moveToNext()) { 
         String phone = pCur.getString(
           pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
         System.out.println("phone" + phone); 
        } 
       } 
       if (pCur != null) { 
        pCur.close(); 
       } 


       // get email and type 

       Cursor emailCur = cr.query(
         ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
         null, 
         ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
         new String[]{id}, null); 
       if (emailCur != null) { 
        while (emailCur.moveToNext()) { 
         // This would allow you get several email addresses 
         // if the email addresses were stored in an array 
         email = emailCur.getString(
           emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
         String emailType = emailCur.getString(
           emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); 


         System.out.println("Email " + email + " Email Type : " + emailType); 
        } 

        if (email == sEmail) { 
         sName = name; 
        } 

       } 
       if (emailCur != null) { 
        emailCur.close(); 
       } 
      } 
     } 
    } 
    return name; 
} 

Ich habe versucht, über Code-Instanz aus http://www.coderzheaven.com/2011/06/13/get-all-details-from-contacts-in-android/ und ich Namen bekommen, aber es ist andere Namen als die E-Mail-ID Inhaber.

mir also sagen, wo ich falsch werde ..

Und von oben Code-Schnipsel, habe ich versucht, auch

if (email == sEmail) { 
          sName = name; 
         } 
         System.out.println("Email " + email + " Email Type : " + emailType); 
        } 



       } 
       if (emailCur != null) { 
        emailCur.close(); 
       } 

statt

     System.out.println("Email " + email + " Email Type : " + emailType); 
        } 

        if (email == sEmail) { 
         sName = name; 
        } 

       } 
       if (emailCur != null) { 
        emailCur.close(); 
       } 

aber nicht helfen auch.

Antwort

0

Sie sollten

Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(email)); 
Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null); 

mit

Uri uri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Email.CONTENT_FILTER_URI, Uri.encode(email)); 
    Cursor cursor = cr.query(uri, new String[]{ContactsContract.CommonDataKinds.Email.CONTACT_ID, 
      ContactsContract.Data.DISPLAY_NAME}, null, null, null); 

ersetzen und dann testen ..

+1

es half .. es rettete meinen Tag .. –

0

Überprüfen Sie immer getCount, bevor Sie es verwenden.

if(cursor!=null && cursor.getCount()>0) 
{ 
cursor.moveToFirst(); 


}else{ 
    return null; 
} 

Prüfen Sie auch, ob Sie die Berechtigung erklärt haben Kontakt in manifest zu lesen:

<uses-permission android:name="android.permission.READ_CONTACTS" /> 

Sie werden auch einige andere ähnliche Berechtigungen benötigen, in der Dokumentation zu Inhalt suchen, die zu sehen.

Ich schlug vor, auf diese Weise versuchen und debuggen Sie auch Ihren Code mit Breakpoint wo ist das Problem.

public static String readContacts(Context context, String email) { 
    ContentResolver cr = context.getContentResolver(); 
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(email)); 
    Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null); 
    String contactName = null; 
    if(cursor!=null && cursor.getCount()>0) 
    { 
    cursor.moveToFirst(); 
    contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); 
    }else{ 
     return null; 
    } 
    if (!cursor.isClosed()) { 
     cursor.close(); 
    } 

    Log.e("....contact name....", email + "\n" + contactName); 

    return contactName; 

} 
+1

Es überhaupt nicht helfen. Ich habe wie in edit-2 in Frage gestellt aber jetzt bekomme ich das LOG auch nicht um den Code nachzuverfolgen. –

+1

Jetzt diese Änderung von dir @rohitsharma hat nicht geholfen, wird jetzt versuchen, den Code zu debuggen. –

+1

Sogar Debugging hat mir nicht geholfen, als null Wert wurde abgerufen ** ** contactName = cursor.getString (cursor.getColumnIndex (KontakteContract.PhoneLookup.DISPLAY_NAME)); ** –