2012-04-19 2 views
1

연락처에 lookupkeys가 있습니다. 이제 lookupkeys를 사용하여 연락처 이미지를 Bitmap/InputStream으로 가져 오려고합니다. Android 설명서는 이미지를 가져 오는 데 도움이되지만 연락처 ID는 lookupkey가 아닙니다."lookupKey"를 사용하여 연락처 이미지를 얻는 방법?

public InputStream openPhoto(long contactId) { 
Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 
Uri photoUri = Uri.withAppendedPath(contactUri, Contacts.Photo.CONTENT_DIRECTORY); 
Cursor cursor = getContentResolver().query(photoUri, 
     new String[] {Contacts.Photo.PHOTO}, null, null, null); 
if (cursor == null) { 
    return null; 
} 
try { 
    if (cursor.moveToFirst()) { 
     byte[] data = cursor.getBlob(0); 
     if (data != null) { 
      return new ByteArrayInputStream(data); 
     } 
    } 
} finally { 
    cursor.close(); 
} 
return null; 
} 

기둥에서 게시물로 달리기는하지만 도움이되지 않습니다. 감사합니다

편집 @Sreejith Krishnan R에 의해 제안하지만 로그 캣에서 다음 예외를 수신 한 시도 2012년 4월 9일이

09-04 03:16:26.359: E/AndroidRuntime(24008): java.lang.IllegalArgumentException: URI: content://com.android.contacts/contacts/lookup/0r272-382C544E2C562C382C4E582C42.2649i11.1987r6285-382C544E2C562C382C4E582C42.1987r6440-382C544E2C562C382C4E582C42.2829r6475-382C544E2C562C382C4E582C42/photo, calling user: com.xyz, calling package:com.xyz 
09-04 03:16:26.359: E/AndroidRuntime(24008): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:144) 
09-04 03:16:26.359: E/AndroidRuntime(24008): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114) 

답변

3

[업데이트] 지금이 있기 때문에 사용할 수있는 일자 API 수준 5

public Bitmap getAvatar(Context context, String lookupKey){ 
    Uri uri = getDataUri(context, lookupKey); 
    if (uri == null){ 
     return null; 
    } 
    Cursor cursor = context.getContentResolver().query(
      uri, 
      new String[] {ContactsContract.Data.DATA15}, 
      null, 
      null, 
      null 
    ); 
    if (cursor == null){ 
     return null; 
    } 
    try{ 
     if (cursor.moveToFirst()){ 
      byte [] bytes = cursor.getBlob(0); 
      InputStream inputStream = new ByteArrayInputStream(bytes); 
      return BitmapFactory.decodeStream(inputStream); 
     } 
    } finally { 
     cursor.close(); 
    } 
    return null; 
} 

public Uri getDataUri(Context context, String lookupKey){ 
    Cursor cursor = context.getContentResolver().query(
      Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey), 
      new String[] {ContactsContract.Contacts.PHOTO_ID}, 
      null, 
      null, 
      null 
    ); 
    if (cursor == null){ 
     return null; 
    } 
    try { 
     if (cursor.moveToFirst()){ 
      long id = cursor.getLong(0); 

      /**http://developer.android.com/reference/android/provider/ContactsContract.ContactsColumns.html#PHOTO_ID 
      * If PHOTO_ID is null, consult PHOTO_URI or PHOTO_THUMBNAIL_URI, 
      * which is a more generic mechanism for referencing the contact photo, 
      * especially for contacts returned by non-local directories (see ContactsContract.Directory). 
      */ 

      if (id == 0){ 
       if (Build.VERSION.SDK_INT < 11){ 
        return null; 
       } 
       return getPhotoThumbnailUri(context, lookupKey); 
      } 
      return ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, id); 
     } 
    } finally { 
     cursor.close(); 
    } 
    return null; 
} 

//Available only for API level 11+ 
public Uri getPhotoThumbnailUri(Context context, String lookupKey){ 
    Cursor cursor = context.getContentResolver().query(
      Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey), 
      new String[] {ContactsContract.Contacts.PHOTO_THUMBNAIL_URI}, 
      null, 
      null, 
      null 
    ); 
    if (cursor == null){ 
     return null; 
    } 
    try{ 
     if (cursor.moveToFirst()){ 
      return Uri.parse(cursor.getString(0)); 
     } 
    } finally { 
     cursor.close(); 
    } 
    return null; 
} 
+0

@ t0mm13b 작업하지 않고 질문을 편집했습니다. –

+0

[이것에 따라] (http://developer.android.com/reference/android/provider/ContactsContract.Contacts.html#CONTENT_LOOKUP_URI)'LOOKUP_KEY'를 첨부해야합니다 ** unencoded ** -'Uri.withAppendedPath (ContactsContracts.Contacts.CONTENT_LOOKUP_URI, lookup_key)'대신. – Joe

+0

@coding crow 나는 대답을 업데이트했다. 당신은 그것을 사용할 수 있습니다 –

관련 문제