2010-06-20 11 views
45

Ich möchte den Namen eines Kontakts abrufen, der einer eingehenden Telefonnummer zugeordnet ist. Wie ich die eingehende Nummer im broascastreceiver mit einem String mit dem Namen des ankommenden Anrufers bearbeiten würde, würde meinem Projekt sehr helfen.Android: Abrufen des Kontaktnamens von der Telefonnummer

Ich würde denken, dies beinhaltet eine Abfrage mit der sql WHERE-Klausel als Filter, aber muss ich die Kontakte sortieren? Ein Beispiel oder ein Hinweis wäre eine große Hilfe.

+0

Für die Anlage zu erhalten von anderen habe ich einen Beitrag geschrieben, der den ganzen Code enthält, um Namen, Foto, Kontakt-ID usw. mit anständiger Erklärung abzufragen. Der Code enthält Snippets, die auf verschiedenen Antworten zu finden sind, aber besser organisiert und getestet sind. Link: http://hellafun.weebly.com/home/get-information-of-a-contact-from-number – Usman

Antwort

60

Dafür müssen Sie den optimierten PhoneLookup-Provider wie beschrieben verwenden.

Fügen Sie die Erlaubnis zu AndroidManifest.xml:

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

Dann:

public String getContactName(final String phoneNumber, Context context) 
{ 
    Uri uri=Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI,Uri.encode(phoneNumber)); 

    String[] projection = new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}; 

    String contactName=""; 
    Cursor cursor=context.getContentResolver().query(uri,projection,null,null,null); 

    if (cursor != null) { 
     if(cursor.moveToFirst()) { 
      contactName=cursor.getString(0); 
     } 
     cursor.close(); 
    } 

    return contactName; 
} 
+0

Direkt von der Dev-Seite, danke für die schnelle Antwort. Die Methode toString() in Uri sollte diese Abfrage in den Namen des Kontakts konvertieren. –

+1

Nein, Sie müssen den Cursor nicht selbst auflösen. Für einige Hilfe überprüfen Sie diese Fragen: http: // stackoverflow.com/questions/903343/cursor-get-the-field-value-android – Pentium10

+1

Ich würde einen Cursor mit einem managedQuery mit dem URI initialisieren, dann den Cursor an die erste Stelle bewegen und die Daten bekommen? Sobald ich den Cursor an die erste Position gebracht habe, benutze ich getString? Ich nehme an, dass die erste Position richtig ist, weil die Abfrage für eine Nummer ist, daher wird die Abfrage Namen nur für diese Nummer hochziehen? –

24

Das war sehr hilfreich, hier ist mein letzter Code für den Namen, die ID des Anrufers abrufen und Foto:

private void uploadContactPhoto(Context context, String number) { 

Log.v("ffnet", "Started uploadcontactphoto..."); 

String name = null; 
String contactId = null; 
InputStream input = null; 

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

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

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

if (cursor.moveToFirst()) { 

    // Get values from contacts database: 
    contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup._ID)); 
    name =  cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); 

    // Get photo of contactId as input stream: 
    Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(contactId)); 
    input = ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), uri); 

    Log.v("ffnet", "Started uploadcontactphoto: Contact Found @ " + number);    
    Log.v("ffnet", "Started uploadcontactphoto: Contact name = " + name); 
    Log.v("ffnet", "Started uploadcontactphoto: Contact id = " + contactId); 

} else { 

    Log.v("ffnet", "Started uploadcontactphoto: Contact Not Found @ " + number); 
    return; // contact not found 

} 

// Only continue if we found a valid contact photo: 
if (input == null) { 
    Log.v("ffnet", "Started uploadcontactphoto: No photo found, id = " + contactId + " name = " + name); 
    return; // no photo 
} else { 
    this.type = contactId; 
    Log.v("ffnet", "Started uploadcontactphoto: Photo found, id = " + contactId + " name = " + name); 
} 

... dann tun Sie einfach was Sie wollen mit "Eingabe" (ihr Foto als InputStream), "na mich "und" contactId ".

Und hier sind die docs der Auflistung ~ 15 oder so Spalten Sie Zugriff haben, nur um sie in der Nähe der Start des Codes auf den Vorsprung aufaddieren oben: http://developer.android.com/reference/android/provider/ContactsContract.PhoneLookup.html

83

Obwohl diese bereits beantwortet wurde, aber Hier ist die komplette Funktion, um den Kontaktnamen von der Nummer zu erhalten. Hoffe, es wird andere helfen:

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

    if(cursor != null && !cursor.isClosed()) { 
     cursor.close(); 
    } 

    return contactName; 
} 

[ Aktualisierung auf Basis von Marcus Kommentar]

Sie werden für diese Erlaubnis fragen müssen:

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

+0

es macht die App "nicht verantwortlich" bei der Wiederaufnahme der Aktivität. Wie soll ich das tun – myatmins

+0

Ich bekomme auch ANR jedes Mal, wenn ich auf Android 5.1 laufen –

+0

Wahrscheinlich für die ANR müssen Sie es auf einem anderen Thread als der UI-Thread ausführen. – Marc

2

Diese Version ist das gleiche wie Antwort von Vikram.exe mit Code, um die ANR zu vermeiden

interface GetContactNameListener { 
    void contactName(String name); 
} 

public void getContactName(final String phoneNumber,final GetContactNameListener listener) { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      ContentResolver cr = getContentResolver(); 
      Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
      Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null); 
      if (cursor == null) { 
       return; 
      } 
      String contactName = null; 
      if(cursor.moveToFirst()) { 
       contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); 
      } 

      if(cursor != null && !cursor.isClosed()) { 
       cursor.close(); 
      } 

      listener.contactName(contactName); 
     } 
    }).start(); 

} 
1

Übergeben Sie die Kontaktnummer, von der Sie den Anruf erhalten, mit der folgenden Methode. Diese Methode überprüft, ob der Kontakt auf Ihrem Mobiltelefon gespeichert ist oder nicht. Wenn der Kontakt gespeichert wird, dann wird es die Kontaktnamen zurückgeben sonst zurückgeben eine Zeichenfolge unbekannte Zahl

Fügen Sie diesen Code in Ihrer Broadcast-Empfänger Klasse

public String getContactDisplayNameByNumber(String number,Context context) { 
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); 
    name = "Incoming call from"; 

    ContentResolver contentResolver = context.getContentResolver(); 
    Cursor contactLookup = contentResolver.query(uri, null, null, null, null); 

    try { 
     if (contactLookup != null && contactLookup.getCount() > 0) { 
      contactLookup.moveToNext(); 
      name = contactLookup.getString(contactLookup.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); 
      // this.id = 
      // contactLookup.getString(contactLookup.getColumnIndex(ContactsContract.Data.CONTACT_ID)); 
      // String contactId = 
      // contactLookup.getString(contactLookup.getColumnIndex(BaseColumns._ID)); 
     }else{ 
      name = "Unknown number"; 
     } 
    } finally { 
     if (contactLookup != null) { 
      contactLookup.close(); 
     } 
    } 

    return name; 
} 

zu Quellcode Besuch this link

Verwandte Themen