2016-12-20 1 views
0

카메라 또는 갤러리에서 이미지를 표시하려고합니다. 카메라에서 사진을 찍을 때 이미지 뷰는 사진을 표시하지만 갤러리에서 피킹 할 때는 그렇지 않습니다. 여기에 코드가 있습니다. 나는 도움이 필요해! 참고, Manifest에 권한을 추가하고 Android 6.0에서 테스트합니다.Android ImageView가 갤러리에서 선택한 이미지를 표시하지 않습니다.

전체 코드는

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode != RESULT_OK) return; 

     Bitmap bitmap = null; 
     String path  = ""; 

     if (requestCode == PICK_FROM_FILE) { 
      mImageCaptureUri = data.getData(); 
      path = getRealPathFromURI(mImageCaptureUri); //from Gallery 

      if (path == null) 
       path = mImageCaptureUri.getPath(); //from File Manager 

      if (path != null) 
       bitmap = BitmapFactory.decodeFile(path); 
     } else { 
      path = mImageCaptureUri.getPath(); 
      bitmap = BitmapFactory.decodeFile(path); 
     } 

     mImageView.setImageBitmap(bitmap); 
    } 

    public String getRealPathFromURI(Uri contentUri) { 
     String [] proj  = {MediaStore.Images.Media.DATA}; 
     Cursor cursor  = managedQuery(contentUri, proj, null, null,null); 

     if (cursor == null) return null; 

     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 

     cursor.moveToFirst(); 

     return cursor.getString(column_index); 
    } 
+0

오류가? 디버그 로그? –

+0

스트림을 디코딩 할 수 없습니다 : java.io.FileNotFoundException :/문서/이미지 : 10552 : 열기 실패 : ENOENT (해당 파일 또는 디렉토리 없음) – user4905906

+0

즉, 잘못된 파일을 검색하려고합니다. getRealPathFromURI 메소드 확인 –

답변

1

heregetRealPathFromURI() 삭제 발견된다. 대체로 UriMediaStore에서 발생하고 미디어에 액세스 할 수있는 경우에만 작동합니다. Uri이 다른 ContentProvider에서 비롯된 경우 오류가 발생하며 미디어가 이동식 저장소에있는 경우 오류가 발생합니다.

사용 an image-loading library 같은 PicassoImageViewUri에서 이미지를로드합니다. 메인 애플리케이션 스레드에서 디스크 I/O 및 이미지 디코딩을하지 않아야하므로 대부분의 이미지로드 라이브러리가 백그라운드 스레드에서 작동합니다.

는 사용자가 직접 이미지를로드을 주장하는 경우, Uri에 대한 InputStream를 얻을 수 ContentResolveropenInputStream() 용도. 그런 다음 BitmapFactory.decodeStream()을 사용하여 InputStream에서 Bitmap을 가져옵니다.

-1

public static String getPath(final Context context, final Uri uri) { 

    // check here to KITKAT or new version 
    final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; 

    // DocumentProvider 
    if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { 

     // ExternalStorageProvider 
     if (isExternalStorageDocument(uri)) { 
      final String docId = DocumentsContract.getDocumentId(uri); 
      final String[] split = docId.split(":"); 
      final String type = split[0]; 

      if ("primary".equalsIgnoreCase(type)) { 
       return Environment.getExternalStorageDirectory() + "/" 
         + split[1]; 
      } 
     } 
     // DownloadsProvider 
     else if (isDownloadsDocument(uri)) { 

      final String id = DocumentsContract.getDocumentId(uri); 
      final Uri contentUri = ContentUris.withAppendedId(
        Uri.parse("content://downloads/public_downloads"), 
        Long.valueOf(id)); 

      return getDataColumn(context, contentUri, null, null); 
     } 
     // MediaProvider 
     else if (isMediaDocument(uri)) { 
      final String docId = DocumentsContract.getDocumentId(uri); 
      final String[] split = docId.split(":"); 
      final String type = split[0]; 

      Uri contentUri = null; 
      if ("image".equals(type)) { 
       contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
      } else if ("video".equals(type)) { 
       contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; 
      } else if ("audio".equals(type)) { 
       contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
      } 

      final String selection = "_id=?"; 
      final String[] selectionArgs = new String[] { split[1] }; 

      return getDataColumn(context, contentUri, selection, 
        selectionArgs); 
     } 
    } 
    // MediaStore (and general) 
    else if ("content".equalsIgnoreCase(uri.getScheme())) { 

     // Return the remote address 
     if (isGooglePhotosUri(uri)) 
      return uri.getLastPathSegment(); 

     return getDataColumn(context, uri, null, null); 
    } 
    // File 
    else if ("file".equalsIgnoreCase(uri.getScheme())) { 
     return uri.getPath(); 
    } 

    return null; 
} 

/** 
* Get the value of the data column for this Uri. This is useful for 
* MediaStore Uris, and other file-based ContentProviders. 
* 
* @param context 
*   The context. 
* @param uri 
*   The Uri to query. 
* @param selection 
*   (Optional) Filter used in the query. 
* @param selectionArgs 
*   (Optional) Selection arguments used in the query. 
* @return The value of the _data column, which is typically a file path. 
*/ 
public static String getDataColumn(Context context, Uri uri, 
            String selection, String[] selectionArgs) { 

    Cursor cursor = null; 
    final String column = "_data"; 
    final String[] projection = { column }; 

    try { 
     cursor = context.getContentResolver().query(uri, projection, 
       selection, selectionArgs, null); 
     if (cursor != null && cursor.moveToFirst()) { 
      final int index = cursor.getColumnIndexOrThrow(column); 
      return cursor.getString(index); 
     } 
    } finally { 
     if (cursor != null) 
      cursor.close(); 
    } 
    return null; 
} 

/** 
* @param uri 
*   The Uri to check. 
* @return Whether the Uri authority is ExternalStorageProvider. 
*/ 
public static boolean isExternalStorageDocument(Uri uri) { 
    return "com.android.externalstorage.documents".equals(uri 
      .getAuthority()); 
} 

/** 
* @param uri 
*   The Uri to check. 
* @return Whether the Uri authority is DownloadsProvider. 
*/ 
public static boolean isDownloadsDocument(Uri uri) { 
    return "com.android.providers.downloads.documents".equals(uri 
      .getAuthority()); 
} 

/** 
* @param uri 
*   The Uri to check. 
* @return Whether the Uri authority is MediaProvider. 
*/ 
public static boolean isMediaDocument(Uri uri) { 
    return "com.android.providers.media.documents".equals(uri 
      .getAuthority()); 
} 

/** 
* @param uri 
*   The Uri to check. 
* @return Whether the Uri authority is Google Photos. 
*/ 
public static boolean isGooglePhotosUri(Uri uri) { 
    return "com.google.android.apps.photos.content".equals(uri 
      .getAuthority()); 
} 

하고 필요한 폭과 높이의 경로에서 비트 맵 이미지를 얻을 코드 아래 사용 사용 ...

// First decode with inJustDecodeBounds=true to check dimensions 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(path,options); 

    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    Bitmap img = BitmapFactory.decodeFile(path, options); 
관련 문제