2013-12-09 3 views
6

내 Android 앱 예제 ContactsList (http://developer.android.com/shareables/training/ContactsList.zip)를 예제로 사용하여 내 앱에서 연락처 활동을 개발했습니다. 그것은 모든 안드로이드 버전에서 완벽하게 작동하지만, 안드로이드 4.4에 접촉 이미지가로드되지 않습니다 나는 다음과 같은 오류가 발생합니다 :이 방법이 실행되는 동안이 문제가 발생NewFromFD nativeDecodeFileDescriptor에서 실패했습니다. - Android 4.4

NewFromFD failed in nativeDecodeFileDescriptor 

:

BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options); 

이며 항상 null을 반환합니다.

내가이 방법을 사용하는 FileDescriptor에 자체를 효율적으로 활용하려면 다음

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

photoDataContactsContract.Contacts.CONTENT_URI에서 가져온 Contacts.PHOTO_THUMBNAIL_URI입니다. 여기

그리고

는 언급 코드의 로그 출력의 일부입니다 :

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 

사람이 문제 좀 도와 주 시겠어요?

+0

로그에 코드에 포함 된 로깅 결과를 보여주십시오. –

+0

나는이 코드의 일부와 관련된 로그를 포함하고 코드를 업데이트했다. 제발, 다른 변수들도 기록 할 필요가 있는지 알려주세요. – Andranik

답변

11

나는 동일한 문제가 있었는데 문제가 무엇인지 모르지만 KitKat & JellyBean (4.2.2)에서 작동하는 해결책을 찾았습니다. 당신이해야 할 일은 AssetFileDescriptor 대신에 InputStream으로 파일을 여는 것입니다. 이 코드를 사용 :

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

그것은 당신이 Display contact badge에서 찾을 수있는 동일한 코드의를, 유일한 수정은 InputStream를 사용한다는 것입니다.

+0

대단히 감사합니다! 이 솔루션은 나를 위해 일했습니다. 나는 안드로이드 4.4와 안드로이드 2.3.3에서 테스트했고 잘 동작한다. 나는 그것도 그들 사이의 모든 버전에서 작동한다고 생각합니다. – Andranik

+0

삼성 기기를 제외하고 훌륭하게 작동합니다 (S4 및 3 번 테스트) – behelit

관련 문제