2013-12-09 7 views
6

Ich habe verwendet Android Beispielprojekt ContactsList (http://developer.android.com/shareables/training/ContactsList.zip) als Beispiel Kontakte Aktivität in meiner App zu entwickeln. Es funktioniert perfekt auf allen Android-Versionen, aber in Android 4.4 die Kontaktbilder werden nicht geladen und ich erhalte den folgenden Fehler:NewFromFD gescheitert in nativeDecodeFileDescriptor - Android 4.4

NewFromFD failed in nativeDecodeFileDescriptor 

Dies geschieht, während diese Methode ausgeführt wird:

BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options); 

und es gibt immer null zurück.

Um die FileDescriptor selbst bekommen Ich benutze diese Methode:

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

und die photoData ist die Contacts.PHOTO_THUMBNAIL_URI von ContactsContract.Contacts.CONTENT_URI genommen.

Und hier ist ein Teil der Log-Ausgabe des genannten Code:

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 

mir jemand bei diesem Problem helfen kann, bitte?

+0

Zeigen Sie Ihre Log mit dem Ausgang der Protokollierung im Code enthalten. –

+0

Ich habe meinen Code aktualisiert und enthalten den Teil des log zu diesem Teil des Codes verwandt. Bitte sagen Sie mir, wenn Sie mich brauchen, um auch andere Variablen zu protokollieren. – Andranik

Antwort

11

Ich hatte das gleiche Problem, und obwohl ich nicht weiß, was das Problem ist, fand ich eine Lösung, die auf KitKat & JellyBean (4.2.2) funktioniert. Alles, was Sie tun müssen, ist die Datei als InputStream anstelle eines AssetFileDescriptor öffnen. Ich diesen Code verwendet:

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

Es ist der gleiche Code, den Sie bei Display contact badge, die einzige Änderung finden kann, ist, dass es InputStream verwendet.

+0

Vielen Dank! Diese Lösung hat auch für mich funktioniert. Ich habe auf Android 4.4 und Android 2.3.3 getestet und es funktioniert gut. Ich denke, es wird auch bei allen Versionen zwischen ihnen funktionieren. – Andranik

+0

Funktioniert prima, außer auf Samsung-Geräten (Getestet auf S4 und Tab 3) – behelit

Verwandte Themen