2010-09-14 6 views
26

In meiner App schreibt Benutzer eine Telefonnummer, und ich möchte den Kontaktnamen mit dieser Telefonnummer finden?Suche nach Telefonnummer

Ich suche in der Regel die Kontakte wie folgt aus:

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

Aber ich tue dies alle Kontakte zugreifen ... In dieser App Ich möchte nur die Kontaktnamen der angegebenen Telefonnummer bekommen ... Wie kann ich die Abfrage einschränken?

Oder muss ich durch alle Kontakte gehen und sehen, ob irgendwelche die angegebene Telefonnummer hat? Aber ich glaube, dass dies auf diese Weise sehr langsam sein kann ...

+0

Lesen Sie die Dokumentation über das, was all die Nullen können –

+0

auch mit :) ersetzt werden, möchten Sie 'CONTENT_FILTER_URI' verwenden. –

+0

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

Antwort

32

Sie sollen bei den empfohlenen ContactsContract.PhoneLookup Anbietern einen Blick

Eine Tabelle, die das Ergebnis des Nachschlagen eine Telefonnummer, zum Beispiel für die Anrufer-ID repräsentiert . Um eine Suche durchzuführen, müssen Sie die Nummer, die Sie suchen möchten, an CONTENT_FILTER_URI anhängen. Diese Abfrage ist stark optimiert.

Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
resolver.query(uri, new String[]{PhoneLookup.DISPLAY_NAME,... 
+0

Danke. Ich versuche, GetContentResolver() in meinem Broadcast-Empfänger, aber es sieht so aus, dass diese Funktion nicht existiert ... –

+3

Versuchen Sie, den Kontextparameter, den Sie haben, Präfix, also sei es context.getContentResolver() – Pentium10

+3

Was speziell in den Rest davon geht Abfrage? Diese Antwort ist nicht viel hilfreicher als die bereits vorhandene Dokumentation. – eternalmatt

79

Wenn Sie den vollständigen Code wollen:

public String getContactDisplayNameByNumber(String number) { 
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); 
    String name = "?"; 

    ContentResolver contentResolver = getContentResolver(); 
    Cursor contactLookup = contentResolver.query(uri, new String[] {BaseColumns._ID, 
      ContactsContract.PhoneLookup.DISPLAY_NAME }, null, null, null); 

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

    return name; 
} 
+0

Danke! Ich würde die Variable 'name' nicht initialisieren, da' null' ein geeigneter Rückgabewert ist, wenn keine Datensätze vorhanden sind. –

+4

Was ist mit den Sonderfällen, wo der Benutzer eine Teilnummer eingegeben hat, aber die Zahlen in einem Format gespeichert, das nicht übereinstimmt? Zum Beispiel ist in Israel das Länderpräfix "+972", und für einige Handynummern fügen Sie "050" hinzu, aber wenn es die volle Nummer ist, wird es "97250" (ohne die erste "0"). Also, wenn der Benutzer "050" eingibt (um alle Telefonnummern zu suchen, die es haben oder zumindest damit beginnen), wird es kein Ergebnis bekommen ... –

+0

In meinem Fall habe ich eine Funktion implementiert, um eine rohe Nummer zu filtern und mache alle möglichen Kombinationen, und dann suche ich eins nach dem anderen. Leider denke ich, Android hat keine Möglichkeit, dies zu vereinfachen. Liege ich falsch? –