2013-04-24 5 views
11

Beim Abrufen einer Mobiltelefonnummer von einer eingehenden SMS wird der Ländercode angehängt.
Jetzt, da der entsprechende Kontakt in der Datenbank nicht den Ländercode enthalten kann den Kontaktnamen zu bekommen Ich verwende:Android - Kontakt von Nummer mit Ländercode

public static String getContactName(String number, Context context) { 

    try { 

     Uri personUri = Uri.withAppendedPath(
      ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number.trim())); 
     String selection = PhoneLookup.NUMBER + " LIKE %" + number.trim() + "%"; 
     Cursor cur = context.getContentResolver().query(personUri, 
      new String[] { 
      PhoneLookup.DISPLAY_NAME 
     }, 
      selection, null, null); 
     if (cur.moveToFirst()) { 
      String str = cur.getString(cur.getColumnIndex(PhoneLookup.DISPLAY_NAME)); 
      cur.close(); 
      return str; 
     } 
    } catch (Exception e) { 
     //e.printStackTrace(); 
     return number; 
    } 
    return number; 
} 

Das funktioniert perfekt, wenn ich in einer genauen Übereinstimmung oder eine teilweise Übereinstimmung passieren. Allerdings, wenn ich den Kontakt-ID erhalten möchte ich diesen Code bin mit:

public static Contact getContact(String number, ContentResolver contentResolver) { 

    Contact contact = new Contact(-1, number); 
    try { 
     Uri personUri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(number)); 
     String selection = ContactsContract.CommonDataKinds.Phone.NUMBER + " LIKE '%" + number + "%'"; 
     Cursor cur = contentResolver.query(personUri, 
      new String[] { 
      ContactsContract.CommonDataKinds.Phone.CONTACT_ID, PhoneLookup.DISPLAY_NAME 
     }, 
      selection, null, null); 
     if (cur.moveToFirst()) { 
      contact = new Contact(Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID))), 
       cur.getString(cur.getColumnIndex(PhoneLookup.DISPLAY_NAME))); 
     } 
     cur.close(); 
    } catch (Exception e) {} 
    return contact; 
} 

Das funktioniert perfekt, wenn die Zahl eine exakte Übereinstimmung ist, aber wenn es nicht ist es gibt nichts zurück. Ich brauche diese Methode, um die ID des Kontakts zu finden, wo seine Nummer als "01111111111" gespeichert ist und die eingehende Nummer "+441111111111" ist. Obwohl sie verschiedene URIs betrachten, ist der Auswahlcode ziemlich gleich, daher bin ich mir nicht sicher, warum das nicht für die Sekunde funktioniert.

Irgendwelche Ideen?

Antwort

9

Ich verwende diesen Code für die gleiche reuirement und es gibt Namen von ContactID aus dem gleichen Code Ihr Problem

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

    ContentResolver contentResolver = context.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

Das sieht mehr wie ich aus - Ich habe nicht den Code vor meinem Atm, aber ich werde ein wenig einchecken und sehen, ob das für mich funktioniert, danke – crazyfool

+0

Es sieht aus wie es nicht mit Indian funktioniert oder russische Zahlen. Zum Beispiel: Kontakt mit der Nummer 89997654321 und ein eingehender Anruf von +79997654321 – Gaket

0
+0

Danke, das könnte mir helfen, die Nummer in verschiedene Formate zu bekommen, aber es hilft nicht mit dem Problem der wie funktioniert nicht. Wenn es eine Möglichkeit dafür gäbe, wäre es eine viel einfachere Lösung, da ich das genaue Format, in dem der Benutzer den Kontakt gespeichert hat, nicht kenne. – crazyfool

0

Ich bin nicht shure beenden, wenn ich Ihre Frage richtig beantworten, aber wie ich das verstanden haben Sie das Problem, dass die phonenumer auf zwei verschiedene Arten erscheinen könnte. Mit oder ohne Ländercode.

Ich denke, es wird zwei einfache Lösungen geben. Am einfachsten wäre es, die Leseeingabe von Ihrem Posteingang zu ändern. Der Posteingang hat immer den Ländercode, der getrimmt werden kann. z.B.

String inboxNo; //the number you've read from the inbox 
int length = inboxNo.length  
if ((inboxNo.equals(whatYouAreSearching) || (String withOutCountryCode = "0"+ inboxNo.substring(3,length-1)) 
... 

Andere Lösung könnte sein, dass Sie das erste Zeichen Ihrer Datenbank überprüfen und wandeln es z.B.

if(!dataBaseNo.substring(0,1).contanins("+"){ 
dataBaseNo = "+44" + dataBaseNo.substring(1,length-1); 
... 
+0

Teilstring holen nicht sehr zuverlässig, da verschiedene Länder unterschiedliche Codes haben. – CKmum

+0

Ich denke Lösung würde man arbeiten. Vielleicht müssen Sie eine dritte oder die if-Klausel setzen, um zu prüfen, ob der Ländercode 3 Zeichen enthält (abhängig von den Ländercodes, die Sie bereitstellen möchten). – B770

0

Vielleicht können Sie eine statische Variable (Array oder etwas) mit allen Ländercodes verwenden und 2-Pass-Ansatz verwenden, um den Code korrekt anzeigen zu lassen. Wenn ein Ländercode hinzugefügt oder etwas hinzugefügt wird, kann dieses Array entweder durch ein Update aktualisiert werden oder, wenn Sie wirklich gut sein müssen, von einer Standardquelle online abrufen und regelmäßige Updates von Ihrer App auslösen.

private static int countrycodes[]; // define the entire data here 
... 
{ 
... 
for(int i=0;i<countrycodes.length;i++){ 
    //match using regexp or something and flag this for 2nd pass 
    } 
} 
0

Obwohl meine Lösung kann schmutzig aussehen, aber dies kann den Trick tun.

String number = "your number"; 
    ContentResolver contentResolver; // content resolver 
    Contact c; 
    if (number != null) { 
     if (number.charAt(0) == '+') { 
      c = getContact(number.substring(1), contentResolver); 
      if (c.firstField == -1) { 
       c = getContact(number.substring(2), contentResolver); 
       if (c.firstField == -1) { 
        c = getContact(number.substring(3), contentResolver); 
       } 
      } 
     } else { 
      c = getContact(number, contentResolver); 
      if (c.firstField == -1) { 
       c = getContact(number.substring(1), contentResolver); 
       if (c.firstField == -1) { 
        c = getContact(number.substring(2), contentResolver); 
       } 
      } 
     } 
    } 

Hoffe, es hilft ...

7

Ich hatte eine gleiche Problem im letzten Monat und ich es geschafft, es zu lösen die libphonenumber Bibliothek von Google verwenden.

Das Problem tritt nur bei lokalen/nationalen Telefonnummern auf, da diese ohne Ländercode oder mit '0' gespeichert werden können.

Zum Beispiel:

Eine typische Telefonnummer in Indien kann in folgenden Formaten

a. +919665123456 
    b. 919665123456 
    c. 09665123456 
    d. 9665123456 

und jede der oben genannten sind perfekt gültige Formate wählen in Indien nur

Aber in gespeichert werden Fall, wenn die Telefonnummern, die zu einem anderen als Ihrem Heimatland gehören, mit Ländercode zwingend gespeichert werden müssen oder Sie keinen Anruf tätigen können.

ex. 

a. +1732-757-2923 (US) 
b. +97433-456-789 (Qatar) 

So tritt das Problem der Anpassung Kontakte wirklich, wenn der betreffende Kontakt local/national ist.

Und das ist, wo libphonenumber ins Bild kommt. Unter Verwendung der Bibliothek können wir die Telefonnummer in dem tatsächlichen nationalen Format extrahieren, das zu dem bestimmten Land gehört.

Hier ist der Trick. Übergeben Sie zuerst die empfangene Nummer von der SMS an die URI für den Abgleich in der Datenbank. Wenn es nicht übereinstimmt, extrahieren Sie die verstaatlichte Telefonnummer mit libphonenumber und übergeben Sie sie dann erneut als uri für den Abgleich. (Uri.encode(number))

Es funktionierte in meinem Fall.

Ich habe es auf die folgende Weise verwendet.

public String getContactDisplayNameByNumber(String number) { 

    if (number != null && number.length() != 0) { 

     String name = lookupNumber(number); 

     if (!name.contains(number)) 
      return name; 
     else { 

      TelephonyManager manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 

      String usersCountryISOCode = manager.getNetworkCountryIso(); 

      PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); 
      try { 
       PhoneNumber phonenUmber = phoneUtil.parse(name, 
         usersCountryISOCode); 
       if (phoneUtil.isValidNumber(phonenUmber)) { 
        temp = phoneUtil 
          .getNationalSignificantNumber(phonenUmber); 


        name = lookupNumber(temp); 
        return name; 
       } 

      } catch (Exception e) { 

       e.printStackTrace(); 

      } 
      return number; 
     } 
    } else { 
     return "Invalid Number"; 
    } 
} 

private String lookupNumber(String number) { 

    uri = Uri.withAppendedPath(
      ContactsContract.PhoneLookup.CONTENT_FILTER_URI, 
      Uri.encode(number)); 
    name = number; 

    contentResolver = getContentResolver(); 
    contactLookup = contentResolver.query(uri, columns, null, null, null); 

    try { 
     if (contactLookup != null && contactLookup.getCount() > 0) { 
      contactLookup.moveToNext(); 
      name = contactLookup.getString(contactLookup 
        .getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); 

     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (contactLookup != null) { 
      contactLookup.close(); 
     } 
    } 

    return name; 
} 

Ich hoffe, es löst Ihr Problem.

2

Für diese Art von Problem Google gelöst werden wieder selbst für uns hat Bibliotheken zur Verfügung gestellt speziell für Android-Handys gedacht. Verwenden Sie keinen kabelgebundenen Code. Sehen Sie sich die offizielle Google-Bibliothek an, die von erfahrenen Entwicklern getestet wurde.

Verwenden Sie libphonenummer Google-Bibliothek zum Parsen, Formatieren, Speichern und Validieren internationaler Telefonnummern gedacht.

Eine Menge Code-Schnipsel sind auf dieser Landing-Page zu finden, also denke ich, dass Sie hier keinen Code schreiben müssen, Sie können sie nur von dort verstehen.

http://code.google.com/p/libphonenumber/

Sie haben al die Ressource Wie zu analysieren und wie passen.

Merkmale dieser Bibliothek, die für Sie relevant sind.

  • Parsing/Formatierung/Validierung von Telefonnummern für alle Länder/Regionen der Welt.

  • isNumberMatch - erhält ein Konfidenzniveau, ob zwei Zahlen gleich sein könnten.

  • findNumbers - findet Zahlen in der Texteingabe.

0

Diese Technik funktioniert für mich, Teil-Nummer zu analysieren, unter Verwendung von:

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

String selection = PhoneLookup.NUMBER + " LIKE %" + number.substring(len-9) + "%"; 

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

vollständiges Beispiel:

private void getContactDetails(String number) { 
    // define the columns you want the query to return 
    String[] projection = new String[] { 
     PhoneLookup.DISPLAY_NAME, 
     PhoneLookup._ID, 
     PhoneLookup.LOOKUP_KEY}; 
    int len = number.length(); 
    // encode the phone number and build the filter URI 
    Uri contactUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number.substring(len-9))); 

    String selection = PhoneLookup.NUMBER + " LIKE %" + number.substring(len-9) + "%"; 

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

    if(cursor != null) { 
     if (cursor.moveToFirst()) { 
      String name = cursor.getString(cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME)); 
      String lookUpKey = cursor.getString(cursor.getColumnIndex(PhoneLookup.LOOKUP_KEY)); 
     } 
     cursor.close(); 
    } 
} 

Es analysiert und passt letzten 10 Ziffern der Zahl, sie hoffen, wird helfen !!!

Verwandte Themen