2013-12-09 11 views
6

Ho utilizzato il progetto di esempio Android ContactsList (http://developer.android.com/shareables/training/ContactsList.zip) come esempio per sviluppare attività Contatti nella mia app. Si sta lavorando perfettamente su tutte le versioni di Android, ma in Android 4.4 le immagini di contatto non vengono caricati ed ottengo il seguente errore:NewFromFD non riuscito in nativeDecodeFileDescriptor - Android 4.4

NewFromFD failed in nativeDecodeFileDescriptor 

Questo accade mentre questo metodo è in esecuzione:

BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options); 

e restituisce sempre null.

Per ottenere risultati FileDescriptor stessa che uso questo metodo:

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

e la photoData è la Contacts.PHOTO_THUMBNAIL_URI tratto da ContactsContract.Contacts.CONTENT_URI.

E qui è una parte di output di registro del codice di cui:

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 

Qualcuno può aiutarmi con questo problema, per favore?

+0

Mostra il registro con l'output del log incluso nel codice. –

+0

Ho aggiornato il mio codice e incluso la parte del log relativa a questa parte di codice. Per favore, dì se hai bisogno di me per registrare anche altre variabili. – Andranik

risposta

11

Ho avuto lo stesso problema e anche se non so quale sia il problema, ho trovato una soluzione, che funziona su KitKat & JellyBean (4.2.2). Tutto ciò che devi fare è aprire il file come InputStream anziché AssetFileDescriptor. Ho usato questo codice:

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

E 'lo stesso codice che si possono trovare presso Display contact badge, l'unica modifica è che usa InputStream.

+0

Grazie mille! Questa soluzione ha funzionato anche per me. Ho provato su Android 4.4 e Android 2.3.3 e funziona perfettamente. Penso che funzionerà anche su tutte le versioni. – Andranik

+0

Funziona benissimo tranne sui dispositivi Samsung (Testato su S4 e Tab 3) – behelit

Problemi correlati