2013-12-09 18 views
6

Uygulamamdaki kişileri Aktivite geliştirmesi için Android örnek projesi ContactsList (http://developer.android.com/shareables/training/ContactsList.zip) örneğini kullandım. Tüm Android sürümlerinde mükemmel çalışıyor, ancak Android 4.4 kontakt görüntüleri gibi yüklenmez ve aşağıdaki hatayı alıyorum: Bu yöntem yürütülürken bu olurNewFromFD, nativeDecodeFileDescriptor'da başarısız oldu - Android 4.4

NewFromFD failed in nativeDecodeFileDescriptor 

:

BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options); 

ve her zaman boş değer döndürür.

Bu yöntemi kullanmak Filedescriptor kendisi almak için:

private Bitmap loadContactPhotoThumbnail(String photoData, int imageSize) { 
    if (!isAdded() || getActivity() == null) { 
     return null; 
    } 

    AssetFileDescriptor afd = null; 
    try { 
     Uri thumbUri; 

     if (Utils.hasHoneycomb()) { 
      thumbUri = Uri.parse(photoData); 
      Log.d("imageloader", photoData); 
     } else { 
      final Uri contactUri = Uri.withAppendedPath(Contacts.CONTENT_URI,photoData); 

      thumbUri = Uri.withAppendedPath(contactUri, Photo.CONTENT_DIRECTORY); 
     } 

     afd = getActivity().getContentResolver().openAssetFileDescriptor(thumbUri, "r"); 
     Log.d("imageloader", afd.toString()); 

     FileDescriptor fileDescriptor = null; 

     try{ 
      fileDescriptor = afd.getFileDescriptor(); 
      Log.d("imageloader", fileDescriptor.toString()); 
     } catch (NullPointerException e){ 
      e.printStackTrace(); 
     } 

     if (fileDescriptor != null) { 
      return ImageLoader.decodeSampledBitmapFromDescriptor(
        fileDescriptor, imageSize, imageSize); 
     } 
    } catch (FileNotFoundException e) { 

     if (BuildConfig.DEBUG) { 
      Log.d(TAG, "Contact photo thumbnail not found for contact " + photoData 
        + ": " + e.toString()); 
     } 
    } finally { 
     if (afd != null) { 
      try { 
       afd.close(); 
      } catch (IOException e) { 

      } 
     } 
    } 

    return null; 
} 

ve photoDataContactsContract.Contacts.CONTENT_URI alınan Contacts.PHOTO_THUMBNAIL_URI olduğunu. Burada

Ve

belirtilen kodun günlük üretiminin bazı parçasıdır:

12-09 21:15:04.683: D/ImageCache(12531): Memory cache created (size = 6554) 
12-09 21:15:05.024: D/ImageLoader(12531): doInBackground - starting work 
12-09 21:15:05.024: D/imageloader(12531): content://com.android.contacts/contacts/296/photo 
12-09 21:15:05.034: D/imageloader(12531): {AssetFileDescriptor: {ParcelFileDescriptor: FileDescriptor[54]} start=0 len=-1} 
12-09 21:15:05.034: D/imageloader(12531): FileDescriptor[54] 
12-09 21:15:05.044: D/ImageLoader(12531): doInBackground - finished work 
12-09 21:15:05.044: D/ImageLoader(12531): doInBackground - starting work 
12-09 21:15:05.054: D/imageloader(12531): content://com.android.contacts/contacts/300/photo 
12-09 21:15:05.064: D/imageloader(12531): {AssetFileDescriptor: {ParcelFileDescriptor: FileDescriptor[54]} start=0 len=-1} 
12-09 21:15:05.064: D/imageloader(12531): FileDescriptor[54] 
12-09 21:15:05.074: D/ImageLoader(12531): doInBackground - finished work 
12-09 21:15:05.084: D/ImageLoader(12531): doInBackground - starting work 
12-09 21:15:05.084: D/imageloader(12531): content://com.android.contacts/contacts/318/photo 
12-09 21:15:05.114: D/imageloader(12531): {AssetFileDescriptor: {ParcelFileDescriptor: FileDescriptor[54]} start=0 len=-1} 
12-09 21:15:05.114: D/imageloader(12531): FileDescriptor[54] 
12-09 21:15:05.114: D/ImageLoader(12531): doInBackground - finished work 
12-09 21:15:05.114: D/ImageLoader(12531): doInBackground - starting work 
12-09 21:15:05.114: D/imageloader(12531): content://com.android.contacts/contacts/319/photo 
12-09 21:15:05.124: D/imageloader(12531): {AssetFileDescriptor: {ParcelFileDescriptor: FileDescriptor[54]} start=0 len=-1} 
12-09 21:15:05.124: D/imageloader(12531): FileDescriptor[54] 
12-09 21:15:05.124: D/ImageLoader(12531): doInBackground - finished work 
12-09 21:15:05.124: D/ImageLoader(12531): doInBackground - starting work 
12-09 21:15:05.124: D/imageloader(12531): content://com.android.contacts/contacts/320/photo 
12-09 21:15:05.144: D/imageloader(12531): {AssetFileDescriptor: {ParcelFileDescriptor: FileDescriptor[54]} start=0 len=-1} 
12-09 21:15:05.144: D/imageloader(12531): FileDescriptor[54] 
12-09 21:15:05.144: D/ImageLoader(12531): doInBackground - finished work 
12-09 21:15:05.144: D/ImageLoader(12531): doInBackground - starting work 
12-09 21:15:05.144: D/imageloader(12531): content://com.android.contacts/contacts/302/photo 
12-09 21:15:05.154: D/imageloader(12531): {AssetFileDescriptor: {ParcelFileDescriptor: FileDescriptor[55]} start=0 len=-1} 
12-09 21:15:05.154: D/imageloader(12531): FileDescriptor[55] 
12-09 21:15:05.154: D/ImageLoader(12531): doInBackground - finished work 
12-09 21:15:05.164: D/ImageLoader(12531): doInBackground - starting work 
12-09 21:15:05.164: D/imageloader(12531): content://com.android.contacts/contacts/301/photo 
12-09 21:15:05.164: D/imageloader(12531): {AssetFileDescriptor: {ParcelFileDescriptor: FileDescriptor[55]} start=0 len=-1} 
12-09 21:15:05.164: D/imageloader(12531): FileDescriptor[55] 
12-09 21:15:05.174: D/ImageLoader(12531): doInBackground - finished work 
12-09 21:15:05.174: D/ImageLoader(12531): doInBackground - starting work 
12-09 21:15:05.174: D/imageloader(12531): content://com.android.contacts/contacts/304/photo 
12-09 21:15:05.184: D/imageloader(12531): {AssetFileDescriptor: {ParcelFileDescriptor: FileDescriptor[55]} start=0 len=-1} 
12-09 21:15:05.184: D/imageloader(12531): FileDescriptor[55] 
12-09 21:15:05.184: D/ImageLoader(12531): doInBackground - finished work 

herkes bu sorunu bana yardımcı olabilir, lütfen?

+0

Günlüğünüzü, kodunuzda yer alan günlüğe kaydetme çıktısıyla göster. –

+0

Kodumu güncelledim ve kodun bu bölümüne ilişkin günlük bölümünü ekledim. Lütfen başka değişkenleri de kaydetmem için bana ihtiyacın olduğunu söyle. – Andranik

cevap

11

Aynı problem vardı ve sorunun ne olduğunu bilmeme rağmen KitKat & JellyBean (4.2.2) üzerinde çalışan bir çözüm buldum. Tek yapmanız gereken dosyayı AssetFileDescriptor yerine InputStream olarak açmaktır. Bu kodu kullandı:

private Bitmap loadContactPhotoThumbnail(String photoData) { 
    InputStream is = null; 
    try { 
     Uri thumbUri; 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      thumbUri = Uri.parse(photoData); 
     } else { 
      final Uri contactUri = Uri.withAppendedPath(
        Contacts.CONTENT_URI, photoData); 
      thumbUri = Uri.withAppendedPath(contactUri, Contacts.Photo.CONTENT_DIRECTORY); 
     } 

     is = getContentResolver().openInputStream(thumbUri); 

     if (is != null) { 
      return BitmapFactory.decodeStream(is); 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } finally { 
     if (is != null) { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    return null; 
} 

Bu Display contact badge bulabileceğiniz aynı kod, tek değişiklik bu InputStream kullanmasıdır.

+0

Çok teşekkür ederim! Bu çözüm benim için de çalıştı. Android 4.4 ve Android 2.3.3 üzerinde test ettim ve iyi çalışıyor. Ben de aralarında tüm sürümleri üzerinde çalışacağını düşünüyorum. – Andranik

+0

Samsung aygıtları dışında harika çalışır (S4 ve Sekme 3'te test edilmiştir) – behelit

İlgili konular