Android TV平台Shared Storage权限适配问题求助
Android TV 共享存储权限获取方案
问题原因
Android TV 系统默认没有预装支持ACTION_OPEN_DOCUMENT_TREE的文件选择器应用,导致调用createOpenDocumentTreeIntent()后出现「您没有可以执行此操作的应用」的提示。
可行方案(非媒体存储相关)
方案1:申请MANAGE_EXTERNAL_STORAGE权限
这是Android 11及以上版本中获取整个外部存储访问权限的官方方式,适用于需要完整共享存储访问的场景。
- 在Manifest中声明权限
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:minSdkVersion="30" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="29" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
- 检查权限并发起申请
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (!Environment.isExternalStorageManager()) { Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); intent.setData(Uri.parse("package:" + getPackageName())); startActivityForResult(intent, MY_PERMISSIONS_GRANT_SHARED_STORAGE); } else { // 已获得权限,执行后续业务逻辑 } } else { // Android 10及以下版本,使用传统读写权限申请流程 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_GRANT_SHARED_STORAGE); } }
- 处理权限回调
在onActivityResult(Android 10及以下使用onRequestPermissionsResult)中检查权限是否授予,再执行对应操作。
方案2:自定义适配TV的文件浏览UI
如果仅需特定目录的访问权限,可自行实现适配Android TV遥控器操作的文件浏览器,通过SAF框架完成目录授权:
- 手动构建SAF目录Uri并申请持久化权限
// 构建外部存储根目录的SAF Uri Uri treeUri = DocumentsContract.buildTreeDocumentUri("com.android.externalstorage.documents", "primary:"); // 申请持久化读写权限 getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
注:此方式需预先明确目标目录的Uri,实用性有限,更推荐方案1。
注意事项
MANAGE_EXTERNAL_STORAGE权限需符合谷歌Play审核政策,仅文件管理器、备份工具等特定类型应用可申请,提交审核时需明确说明权限使用场景。- 自定义UI需适配Android TV的遥控器焦点导航逻辑,符合TV端交互规范。
内容的提问来源于stack exchange,提问作者Marek Halmo
相关产品推荐
相关产品推荐

