2012-12-13 42 views
13

chức năng tôi sử dụng để lấy Uri của hình thu nhỏ của hình ảnh liên hệ từ số điện thoại. :Tải hình ảnh liên hệ vào bitmap

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

Mà sẽ trả về một Uri theo hình thức:

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

bây giờ, nếu tôi sử dụng Uri này trong một ImageView với setImageUri (Uri) chức năng, nó hoạt động.

Nhưng tải một Bitmap là một vấn đề. chức năng tôi đang sử dụng là:

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

luôn bị treo. LogCat là:

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) 

hãy trợ giúp!

Trả lời

31

Tôi không nghĩ bạn nên chuyển uri của ảnh để mởContactphotoinputstream. Bạn chỉ cần chuyển uri của liên hệ để lấy bitmap.

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

Hoặc nếu bạn đang đi để vượt qua sự tiếp xúc ảnh uri sau đó bạn có thể sử dụng

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

thanks a lot! phần thứ hai của mã hoạt động hoàn hảo! – Daksh

+0

chấp nhận câu trả lời nếu nó giúp. – nandeesh

Các vấn đề liên quan