Android 11
\n targetApi 30
\n不请求READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE
\n使用SAF api 获取如下 uri:
\n "content://com.android.providers.media.documents/document/document%3"
\n并解析uri 像这样:
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}\nRun Code Online (Sandbox Code Playgroud)\n我在android 11以下的手机上得到正常值,但在android 11手机上得到空值
\n好吧,我想获取文件的真实路径或名称
\n有人可以帮我\xef\xbc\x9f
\n谢谢!
| 归档时间: |
|
| 查看次数: |
1043 次 |
| 最近记录: |