2010-02-01 12 views
16

Sto cercando di ottenere il nome del mittente dal database dei contatti utilizzando un provider di contenuti.Come cercare il nome di un contatto dal proprio numero di telefono su Android?

Il problema è che non so come implementarlo. Come ora posso solo estrarre il numero di telefono da smsMessage. Devo controllare per vedere se il numero di telefono che sta chiamando è prima nei contatti degli utenti e se è visualizzato il nome se non lo è, quindi visualizza il numero.

+3

Probabilmente si può generalizzare questo domanda a qualcosa come: 'Come si fa a cercare un contatto dato una stringa di numeri di telefono grezza e non formattata? ' –

risposta

24

Sì, questo è possibile utilizzando ContactsContract.PhoneLookup.CONTENT_FILTER_URI in Android 2.0 e versioni successive e Contacts.Phones.CONTENT_FILTER_URL in Android 1.6 e versioni precedenti.

Ad esempio, consultare la documentazione di ContactsContract.PhoneLookup. Estratto di seguito:

// Android 1.6 and earlier (backwards compatible for Android 2.0+) 
Uri uri = Uri.withAppendedPath(Contacts.Phones.CONTENT_FILTER_URL, Uri.encode(phoneNumber)); 

// Android 2.0 and later 
Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 

// Query the filter URI 
String[] projection = new String[]{ PhoneLookup.DISPLAY_NAME, ... 
Cursor cursor = context.getContentResolver().query(uri, projection, ... 

UPDATE: Il formato del numero di telefono non importa. Il confronto è robusto e altamente ottimizzato su Android; è fatto usando una funzione nativa sqlite chiamata PHONE_NUMBERS_EQUAL. Per ulteriori dettagli, search the codebase for this method. A proposito, non sono sicuro che sia sicuro utilizzare questa funzione direttamente nelle tue app, ma non lo farei.

+2

Cosa va specificamente nel resto della query? Questa risposta non è molto più utile della documentazione già esistente. – eternalmatt

+4

Il formato del numero di telefono è importante? Cioè, '(555) 555-5555' e' 555-555-5555' corrispondono entrambi a '555555555'? –

+0

Il formato del numero di telefono è importante? Cioè, i numeri (555) 555-5555 e 555-555-5555 corrispondono entrambi al 555555555? [2] –

19

Ecco quello che ho fatto

ContentResolver localContentResolver = this.mContext.getContentResolver(); 
Cursor contactLookupCursor = 
    localContentResolver.query(
      Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, 
      Uri.encode(phoneNumber)), 
      new String[] {PhoneLookup.DISPLAY_NAME, PhoneLookup._ID}, 
      null, 
      null, 
      null); 
try { 
while(contactLookupCursor.moveToNext()){ 
    String contactName = contactLookupCursor.getString(contactLookupCursor.getColumnIndexOrThrow(PhoneLookup.DISPLAY_NAME)); 
    String contactId = contactLookupCursor.getString(contactLookupCursor.getColumnIndexOrThrow(PhoneLookup._ID)); 
    Log.d(LOGTAG, "contactMatch name: " + contactName); 
    Log.d(LOGTAG, "contactMatch id: " + contactId); 
    } 
} finally { 
contactLookupCursor.close(); 
} 

Passando il numero di telefono è già in Uri.encode (phoneNumber)

+0

grazie mi ha aiutato – Sando

+0

Altri buoni esempi qui: http://stackoverflow.com/questions/3079365/android-retrieve-contact-name-from-phone-number/8695649 – mdaddy

+0

Questo mi ha aiutato molto. Grazie Andrew, solo una piccola domanda. C'è la possibilità di cambiare questo codice un po 'di più, e farlo cercare/abbinare un numero di telefono al nome del contatto mentre scrivi? Diciamo che il mio numero è 444 886 444. Mi ricordo di ricordare "886", non il resto. Dovrebbe cercare e abbinare e "darmi" dei risultati. Se sei disposto a rispondere al mio commento, sarebbe molto apprezzato. Se qualcuno ha un link per questo genere di cose, per favore pubblica. Grazie in anticipo! – Paramone

Problemi correlati