2011-10-12 18 views
9

Sto lavorando con Android Contact ContentProvider. Ho un numeroe ho bisogno di ottenere l'URI della foto del contatto associato a questo numero di telefono. Come posso farlo???come ottenere la foto del contatto URI

so di poter ottenere i dati grezzi della fotografia e costruire un InputStream, ma io non voglio il flusso di input, ho bisogno del URI.

EDIT: In origine sto usando seguente codice per recuperare informazioni di contatto

Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNo)); 
    Cursor cursor = context.getContentResolver().query(uri, details, null, null, null); 

risposta

11

Per ottenere il conatct id utilizzando il numero di telefono utilizzare il seguente codice:

import android.provider.ContactsContract.PhoneLookup; 

public String fetchContactIdFromPhoneNumber(String phoneNumber) { 
    Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, 
     Uri.encode(phoneNumber)); 
    Cursor cursor = this.getContentResolver().query(uri, 
     new String[] { PhoneLookup.DISPLAY_NAME, PhoneLookup._ID }, 
     null, null, null); 

    String contactId = ""; 

    if (cursor.moveToFirst()) { 
     do { 
     contactId = cursor.getString(cursor 
      .getColumnIndex(PhoneLookup._ID)); 
     } while (cursor.moveToNext()); 
    } 

    return contactId; 
    } 

e utilizzare l'ID di contatto ottenuto per ottenere l'URI di foto contatc. Utilizzare il seguente codice per ottenere URI foto:

import android.provider.ContactsContract; 
import android.provider.ContactsContract.CommonDataKinds.Phone; 

public Uri getPhotoUri(long contactId) { 
    ContentResolver contentResolver = getContentResolver(); 

    try { 
     Cursor cursor = contentResolver 
      .query(ContactsContract.Data.CONTENT_URI, 
       null, 
       ContactsContract.Data.CONTACT_ID 
        + "=" 
        + contactId 
        + " AND " 

        + ContactsContract.Data.MIMETYPE 
        + "='" 
        + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE 
        + "'", null, null); 

     if (cursor != null) { 
     if (!cursor.moveToFirst()) { 
      return null; // no photo 
     } 
     } else { 
     return null; // error in cursor process 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 

    Uri person = ContentUris.withAppendedId(
     ContactsContract.Contacts.CONTENT_URI, contactId); 
    return Uri.withAppendedPath(person, 
     ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); 
    } 

Spero che questo possa essere d'aiuto.

+4

Non dimenticare di chiudere il cursore quando hai finito o otterrai una perdita di memoria. –

+2

Assicurati inoltre di includere l'autorizzazione READ_CONTACTS nel manifesto della tua app. – PeteH

+6

Questo proc getPhotoUri è totalmente sbagliato in ogni modo possibile ... NON UTILIZZARLO ... È necessario verificare l'esistenza dell'uri troppo .. La risposta dovrebbe essere cancellata .. Se hai bisogno di uri leggi il PHOTO_URI o PHOTO_THUMBNAIL_URI da un fornitore di contenuti per URI validi! – xnagyg

7

Questa soluzione dimostra come ottenere un'immagine da un contatto utente e quindi visualizzarla in un ImageView.

ImageView profile = (ImageView)findViewById(R.id.imageView1);     
Uri my_contact_Uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(Contact_Id)); 
InputStream photo_stream = ContactsContract.Contacts.openContactPhotoInputStream(getContentResolver(),my_contact_Uri);    
BufferedInputStream buf =new BufferedInputStream(photo_stream); 
Bitmap my_btmp = BitmapFactory.decodeStream(buf); 
profile.setImageBitmap(my_btmp); 
+0

Il codice manca "buf" in BufferedInputStream buf = new BufferedInputStream (photo_stream); –

+4

Inoltre, è possibile impostare direttamente l'Uri su imageView (usando imageView.setImageURI (uri) invece di dover convertire da solo in Bitmap. –

+0

@paul_sns che ne dici di memorizzarlo nel database? posso usare il uri o il link bitmap? – ajdeguzman

0
final boolean IS_HONEYCOMB = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; 
    String phoneNumber = "+1 416 385 7805"; 
    ContentResolver contentResolver = context.getContentResolver(); 
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
    String[] projection = new String[] { 
      ContactsContract.Contacts._ID, 
      ContactsContract.Contacts.LOOKUP_KEY, 
      IS_HONEYCOMB ? ContactsContract.Contacts.PHOTO_THUMBNAIL_URI : ContactsContract.Contacts._ID, 
      }; 
    Cursor cursor = 
      contentResolver.query(
        uri, 
        projection, 
        null, 
        null, 
        null); 
    if (cursor != null && cursor.moveToNext()) { 
     long contactId = cursor.getLong(0); 
     String lookupKey = cursor.getString(1); 
     String thumbnailUri = cursor.getString(2);   
     cursor.close(); 
    } 

Così ora se SDK è a nido d'ape o superiore u avere miniature uri del contatto. Oppure si può costruire un occhiata uri come questo:

Uri uri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey); 

P.S. Se già conoscete Contact ID e/o ricerca della chiave è possibile costruire un Uri da stringa:

ricerca: content://com.android.contacts/contacts/lookup/{lookup key}/{contact id} miniature: content://com.android.contacts/contacts/{contact id}/photo

quindi è meglio per memorizzare nella cache questi valori.

2

Ecco il codice da Android Documentation.

Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId); 
return Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); 
1

È possibile ottenere PHOTO_URI da NUMBER basta usare seguente codice inoltre è possibile utilizzare _ID.

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

    if (!cursor.isClosed()) { 
     cursor.close(); 
    } 
    return contactImage; 
} 
Problemi correlati