如何在Android 11和targetApi 30上从文档uri获取真实文件路径或文件名

xia*_*oba 7 android saf

Android 11
\n targetApi 30
\n不请求READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE
\n使用SAF api 获取如下 uri:
\n "content://com.android.providers.media.documents/document/document%3"
\n并解析uri 像这样:

\n
public static String getRealPath(uri) {\n    String docId = DocumentsContract.getDocumentId(uri);\n    String[] split = docId.split(":");\n    String type = split[0];\n    Uri contentUri;\n    switch (type) {\n        case "image":\n            contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;\n            break;\n        case "video":\n            contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;\n            break;\n        case "audio":\n            contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;\n            break;\n        default:\n            contentUri = MediaStore.Files.getContentUri("external");\n    }\n    String selection = "_id=?";\n    String[] selectionArgs = new String[]{\n            split[1]\n    };\n\n    return getDataColumn(getContext(), contentUri, selection, selectionArgs);\n}\n\npublic static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {\n    Cursor cursor = null;\n    String column = "_data";\n    String[] projection = {\n            column\n    };\n    try {\n        cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);\n        if (cursor != null && cursor.moveToFirst()) {\n            int column_index = cursor.getColumnIndexOrThrow(column);\n            String value = cursor.getString(column_index);\n            if (value.startsWith("content://") || !value.startsWith("/") && !value.startsWith("file://")) {\n                return null;\n            }\n            return value;\n        }\n    } catch (Exception e) {\n        e.printStackTrace();\n    } finally {\n        if (cursor != null) {\n            cursor.close();\n        }\n    }\n    return null;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我在android 11以下的手机上得到正常值,但在android 11手机上得到空值

\n

好吧,我想获取文件的真实路径或名称

\n

有人可以帮我\xef\xbc\x9f
\n谢谢!

\n