Android Oreo如何从uri获取真实路径?

Android Oreo如何从uri获取真实路径?,android,android-8.0-oreo,file-sharing,file-copying,android-8.1-oreo,Android,Android 8.0 Oreo,File Sharing,File Copying,Android 8.1 Oreo,我使用这段代码从URI获取真实路径。它正在工作 不含奥利奥的棉花糖: private String getPathNew(Activity activity, Uri uri) { if (isDownloadsDocument(uri)) { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId(

我使用这段代码从URI获取真实路径。它正在工作 不含奥利奥的棉花糖:

private String getPathNew(Activity activity, Uri uri) { 
    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(activity, contentUri, null, null);
    }
    return null;
}

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 column_index = cursor.getColumnIndexOrThrow(column);
            return cursor.getString(column_index);
        }
    } finally {
        if (cursor != null)
            cursor.close();
    }
    return null;
}

我做错了什么?

可能与@shizhen重复不,不是。这是一个奇怪的“bug”,只出现在最近的Android版本中,比如Oreo。@ChenLiYong此错误是由于在年首次引入的文件策略发生了更改而导致的。你要找的问题就在这里。@KartikOhri很想知道。谢谢这个解决方案对我很有效:
 public static String getRealPathFromURI(Context context, Uri contentUri) {
    String[] proj = {MediaStore.Images.Media.DATA};
    Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, 
                                                                               null);
    if (cursor != null) {
        int column_index = 
        cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
    return null;
}