安卓 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 文件资源管理器将文件放入其中并自动鼓起!...
我没有对放置在那里的文件的读取权限,无论如何我想我会在这里发表评论,因为我不希望人们在帖子上绊倒并认为这是有效的,因为它没有。