2012-12-13 12 views
13

die Funktion, die ich verwende, um den Uri der Kontaktbildminiatur von der Telefon-Nr. :Load Kontakt Bild in 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); 
} 

, die eine Uri in Form zurückkehren wird: jetzt

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

, wenn ich dieses Uri in einem Image mit der setImageUri (Uri) Funktion zu verwenden, funktioniert es.

Aber das Laden einer Bitmap ist ein Problem. Die Funktion, die ich verwende ist:

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

, die immer abstürzt. LogCat ist:

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) 

bitte helfen!

Antwort

31

Ich glaube nicht, dass Sie die URL des Fotos an openContactphotoinputstream übergeben sollten. Sie müssen nur die URL des Kontakts selbst übergeben, um die Bitmap zu erhalten.

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

Oder wenn Sie den Kontakt Foto uri passieren gehen dann könnte man

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

Dank viel nutzen! Der zweite Teil des Codes funktionierte perfekt! – Daksh

+0

akzeptieren Sie die Antwort, wenn es geholfen hat. – nandeesh