2012-12-13 71 views
13

我用來從手機號獲取聯繫人圖像縮略圖的Uri的功能。 :將聯繫人圖像加載到位圖中

public static Uri getPhotoURIFromAddress(Context activity, String address) { 
    String contactId = getContactIdFromAddress(activity, address); 

    ContentResolver contentResolver = activity.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 
     } 
     cursor.close(); 

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

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

將在形式返回一個URI:

content://com.android.contacts/contacts/799/photo 

現在,如果我與setImageUri(URI)功能的ImageView的使用這個開放的,它的工作原理。

但加載位圖是一個問題。我使用的功能是:

public static Bitmap getContactBitmapFromURI(Context context, Uri uri) { 
     InputStream input = ContactsContract.Contacts 
       .openContactPhotoInputStream(context.getContentResolver(), uri); 
     if (input == null) { 
      return null; 
     } 
     return BitmapFactory.decodeStream(input); 
    } 

它總是崩潰。 LogCat是:

12-13 21:40:26.016: E/AndroidRuntime(9076): FATAL EXCEPTION: main 
12-13 21:40:26.016: E/AndroidRuntime(9076): java.lang.RuntimeException: Unable to start receiver com.daksh.fss.SMSReceiver: java.lang.IllegalArgumentException: URI: content://com.android.contacts/contacts/799/photo/photo, calling user: com.daksh.fss, calling package:com.daksh.fss 
12-13 21:40:26.016: E/AndroidRuntime(9076):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2362) 
12-13 21:40:26.016: E/AndroidRuntime(9076):  at android.app.ActivityThread.access$1500(ActivityThread.java:142) 
12-13 21:40:26.016: E/AndroidRuntime(9076):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284) 
12-13 21:40:26.016: E/AndroidRuntime(9076):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-13 21:40:26.016: E/AndroidRuntime(9076):  at android.os.Looper.loop(Looper.java:137) 
12-13 21:40:26.016: E/AndroidRuntime(9076):  at android.app.ActivityThread.main(ActivityThread.java:4931) 
12-13 21:40:26.016: E/AndroidRuntime(9076):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-13 21:40:26.016: E/AndroidRuntime(9076):  at java.lang.reflect.Method.invoke(Method.java:511) 
12-13 21:40:26.016: E/AndroidRuntime(9076):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
12-13 21:40:26.016: E/AndroidRuntime(9076):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558) 
12-13 21:40:26.016: E/AndroidRuntime(9076):  at dalvik.system.NativeStart.main(Native Method) 
12-13 21:40:26.016: E/AndroidRuntime(9076): Caused by: java.lang.IllegalArgumentException: URI: content://com.android.contacts/contacts/799/photo/photo, calling user: com.daksh.fss, calling package:com.daksh.fss 
12-13 21:40:26.016: E/AndroidRuntime(9076):  at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:170) 
12-13 21:40:26.016: E/AndroidRuntime(9076):  at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140) 
12-13 21:40:26.016: E/AndroidRuntime(9076):  at android.content.ContentProviderProxy.query(ContentProviderNative.java:366) 
12-13 21:40:26.016: E/AndroidRuntime(9076):  at android.content.ContentResolver.query(ContentResolver.java:370) 
12-13 21:40:26.016: E/AndroidRuntime(9076):  at android.content.ContentResolver.query(ContentResolver.java:313) 
12-13 21:40:26.016: E/AndroidRuntime(9076):  at android.provider.ContactsContract$Contacts.openContactPhotoInputStream(ContactsContract.java:1973) 
12-13 21:40:26.016: E/AndroidRuntime(9076):  at android.provider.ContactsContract$Contacts.openContactPhotoInputStream(ContactsContract.java:2004) 

請大家幫忙!

回答

31

我不認爲你應該通過照片的URI來openContactphotoinputstream。你只需要傳遞聯繫人的URI就可以獲得位圖。

Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id); 
    InputStream stream = ContactsContract.Contacts.openContactPhotoInputStream(
      mContext.getContentResolver(), uri); 

或者,如果你要通過聯繫人照片的URI,那麼你可以使用

public static Bitmap getContactBitmapFromURI(Context context, Uri uri) { 
     InputStream input = context.getContentResolver().openInputStream(uri) 
     if (input == null) { 
      return null; 
     } 
     return BitmapFactory.decodeStream(input); 
    } 
+0

非常感謝!代碼的第二部分工作完美!如果它有幫助, – Daksh

+0

確實接受答案。 – nandeesh

相關問題