2011-10-12 9 views
9

Pracuję z systemem Android Contact ContentProvider. Mam numer telefonu i potrzebuję uzyskać URI z kontaktu powiązanego z tym numerem telefonu. Jak mogę to zrobić???jak uzyskać zdjęcie kontaktu URI

wiem, że mogę dostać surowych danych na zdjęcie i zbudować InputStream, ale nie chcę strumień wejściowy, muszę URI.

EDIT: Oryginalnie Używam następujący kod do pobrania Informacje kontaktowe

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

Odpowiedz

11

Aby uzyskać identyfikator conatct za pomocą numeru telefonu użyć następującego kodu:

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; 
    } 

i używać Contact ID uzyskany w celu uzyskania URI obrazu kontatowego. Użyj następującego kodu do uzyskania zdjęcia URI:

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); 
    } 

Mam nadzieję, że to pomoże.

+4

Nie zapomnij zamknąć kursora, gdy skończysz lub dostaniesz wyciek pamięci. –

+2

Pamiętaj też o włączeniu uprawnienia READ_CONTACTS do Manifestu aplikacji. – PeteH

+6

Ten proces getPhotoUri jest całkowicie błędny w każdy możliwy sposób ... NIE UŻYWAJ GO ... Musisz również sprawdzić istnienie URI. Odpowiedź powinna zostać usunięta. Jeśli potrzebujesz URI, przeczytaj PHOTO_URI lub PHOTO_THUMBNAIL_URI z dostawca treści dla poprawnych URI! – xnagyg

7

To rozwiązanie pokazuje, jak uzyskać obraz z kontaktu użytkownika, a następnie wyświetlić go w postaci 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

Kod brakuje "buf" w BufferedInputStream buf = new BufferedInputStream (photo_stream); –

+4

Możesz także bezpośrednio ustawić URI na imageView (używając imageView.setImageURI (uri) zamiast samodzielnie konwertować na Bitmapę. –

+0

@paul_sns jak o przechowywanie go w bazie danych? Czy mogę użyć łącza uri lub bitmapy? – 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(); 
    } 

Więc teraz, jeśli SDK jest plaster miodu lub wyższy u ma uri miniatury kontaktu. Albo można skonstruować uri lookup jak to:

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

PS: Jeśli już wiesz, Contact ID i/lub odnośnika klucza można skonstruować URI z ciągiem:

odnośnika: content://com.android.contacts/contacts/lookup/{lookup key}/{contact id} miniatury content://com.android.contacts/contacts/{contact id}/photo

Więc lepiej buforować te wartości.

2

Oto kod z Android Documentation.

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

Można uzyskać PHOTO_URI przez NUMBER wystarczy użyć następującego kodu również można użyć _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; 
}