URI에서 파일의 절대 경로 가져오기

6019 단어
메소드 코드:
public void uriToFilepath(Uri uri){
    String[] proj = {MediaStore.Images.Media.DATA};
    Cursor cursor = managedQuery(uri, proj, null, null, null);
    int index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    String img_path = cursor.getString(index);
    File file = new File(img_path);
    Log.e("file", file.isFile() + file.getPath());
}

Android 4. 해결4 이상 Uri 변환:
/**
 *   Uri        ,  Android4.4    Uri  
 *
 * @param context
 * @param imageUri
 */
@TargetApi(19)
public static String getImageAbsolutePath(Activity context, Uri imageUri) {
    if (context == null || imageUri == null)
        return null;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT && DocumentsContract.isDocumentUri(context, imageUri)) {
        if (isExternalStorageDocument(imageUri)) {
            String docId = DocumentsContract.getDocumentId(imageUri);
            String[] split = docId.split(":");
            String type = split[0];
            if ("primary".equalsIgnoreCase(type)) {
                return Environment.getExternalStorageDirectory() + "/" + split[1];
            }
        } else if (isDownloadsDocument(imageUri)) {
            String id = DocumentsContract.getDocumentId(imageUri);
            Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
            return getDataColumn(context, contentUri, null, null);
        } else if (isMediaDocument(imageUri)) {
            String docId = DocumentsContract.getDocumentId(imageUri);
            String[] split = docId.split(":");
            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;
            }
            String selection = MediaStore.Images.Media._ID + "=?";
            String[] selectionArgs = new String[]{split[1]};
            return getDataColumn(context, contentUri, selection, selectionArgs);
        }
    } // MediaStore (and general)
    else if ("content".equalsIgnoreCase(imageUri.getScheme())) {
        // Return the remote address
        if (isGooglePhotosUri(imageUri))
            return imageUri.getLastPathSegment();
        return getDataColumn(context, imageUri, null, null);
    }
    // File
    else if ("file".equalsIgnoreCase(imageUri.getScheme())) {
        return imageUri.getPath();
    }
    return null;
}

public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
    Cursor cursor = null;
    String column = MediaStore.Images.Media.DATA;
    String[] projection = {column};
    try {
        cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
        if (cursor != null && cursor.moveToFirst()) {
            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());
}

파일 경로에 따라 ui를 얻습니다:
String type = Utils.ensureNotNull(intent.getType());
Log.d(TAG, "uri is " + uri);
if (uri.getScheme().equals("file") && (type.contains("image/"))) {
    String path = uri.getEncodedPath();
    Log.d(TAG, "path1 is " + path);
    if (path != null) {
        path = Uri.decode(path);
        Log.d(TAG, "path2 is " + path);
        ContentResolver cr = this.getContentResolver();
        StringBuffer buff = new StringBuffer();
        buff.append("(")
                .append(Images.ImageColumns.DATA)
                .append("=")
                .append("'" + path + "'")
                .append(")");
        Cursor cur = cr.query(
                Images.Media.EXTERNAL_CONTENT_URI,
                new String[] { Images.ImageColumns._ID },
                buff.toString(), null, null);
        int index = 0;
        for (cur.moveToFirst(); !cur.isAfterLast(); cur
                .moveToNext()) {
            index = cur.getColumnIndex(Images.ImageColumns._ID);
            // set _id value
            index = cur.getInt(index);
        }
        if (index == 0) {
            //do nothing
        } else {
            Uri uri_temp = Uri
                    .parse("content://media/external/images/media/"
                            + index);
            Log.d(TAG, "uri_temp is " + uri_temp);
            if (uri_temp != null) {
                uri = uri_temp;
            }
        }
    }
}

좋은 웹페이지 즐겨찾기