1

安卓 11,

我正在尝试创建一个可公开访问的文件夹,我可以在其中存储我的媒体文件,每个游戏类型将包含 1 个文件夹和 1 个文本文件(可能有很多),我不希望任何其他应用程序能够访问根文件夹(文件资源管理器除外),因为用户“可能”在文件夹中包含 R18 限制或可能没有的内容,我无法控制其中的内容,如果我能提供这样的话会很好孩子在设备上为 barnie 寻找图片时不会误撞到内容。

我在 GitHub 上找到了一些代码,它们在 Android 10 上完成了上述操作,并且在 Android 10 上完美运行,但在涉及 Android 11 时除了蓝色药丸之外找不到任何东西,示例代码形式的帮助会很棒,是的,我知道仅针对 Android 11 限制了我,但我宁愿接受限制,也不愿使用许多不同版本的代码。

val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply {
    flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or
            Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
}
startActivityForResult(intent, OPEN_FOLDER_REQUEST_CODE)

编辑 2

经过一些黑客攻击,因为'startActivityForResult(Intent!,Int):Unit'已被弃用。在 Java 中已弃用,我最终得到了这个,结果是一个 URI,我现在可以使用它来将文件传递给其他 API 调用吗?

pref = getSharedPreferences("myPref", Context.MODE_PRIVATE)
var userFolderData: String? = pref.getString("userFolderData", "")

if (userFolderData=="") {
    val getUserFolderData =
        registerForActivityResult(ActivityResultContracts.OpenDocumentTree()) {
            mytools.debug(it.toString())
            pref.edit().putString("userFolderData",it.toString()).apply()
            userFolderData = it.toString()
        }
    getUserFolderData.launch("".toUri())
}
mytools.debug("userFolderData = ${userFolderData}")

编辑 3

所以我对返回的 URI 进行了测试;无论我做什么,总是相同的故事,是的,这是非常丑陋的黑客,但这是我能找到的最简单的测试方法。

ivtitleimage.setImageURI("content://com.android.externalstorage.documents/document/primary%3ATest%2FMelsDeck%2Fbendover01.jpg".toUri())

31833-31833/com.example.cardgamexxx E/AndroidRuntime:致命异常:主进程:com.example.cardgamexxx,PID:31833 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.cardgamexxx/com.example. cardgamexxx.MainActivity}: java.lang.SecurityException: Permission Denial: opening provider com.android.externalstorage.ExternalStorageProvider from ProcessRecord{5a390cf 31833:com.example.cardgamexxx/u0a741} (pid=31833, uid=10741) 需要你获取使用 ACTION_OPEN_DOCUMENT 或相关 API 访问

编辑 4

对,所以用户选择文件夹/使用registerForActivityResult上面的代码创建一个文件夹,我使用 Cx 文件资源管理器将文件放入其中并自动鼓起!...

我没有对放置在那里的文件的读取权限,无论如何我想我会在这里发表评论,因为我不希望人们在帖子上绊倒并认为这是有效的,因为它没有。

4

1 回答 1

0

在 Android 11 设备上,如果您的应用已请求“所有文件访问权限”,则您的应用只能以经典方式在外部存储的根目录上创建文件夹。

或者它可以使用存储访问框架,例如 ACTION_OPEN_DOCUMENT_TREE 让用户在外部存储的根目录中创建一个文件夹,然后选择它。

于 2021-07-20T08:06:05.047 回答