Android 11与Windows互传文件的创建、读取及访问问题求解
Android 11 跨设备文件交互适配方案
问题1:外置SD卡自定义目录下CDG文件无法读取
Android 11 开始强制启用分区存储机制,默认仅允许应用访问自身专属目录,以及公共媒体库内的标准格式媒体文件:
- MP3属于系统可识别的标准音频格式,会被纳入媒体库Audio分类,应用申请
READ_EXTERNAL_STORAGE权限后可直接访问 - CDG属于非标准自定义格式,未被纳入系统默认媒体分类,因此无法通过常规存储权限读取
最优解决方案
引导用户通过系统文件选择器授权目标目录的持久访问权限,无需申请敏感存储权限,适配成本低且符合Google Play上架规范:
- 调用
ACTION_OPEN_DOCUMENT_TREEIntent,引导用户手动选择外置SD卡下的Karaoke目录 - 在
onActivityResult回调中获取返回的目录Uri,调用getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION)申请持久化访问权限,避免应用重启后权限失效 - 后续所有对该目录下CDG、MP3文件的读写操作均通过该Uri执行,无需额外权限
备选方案
若你的应用有合理的全文件访问场景,可在AndroidManifest中声明MANAGE_EXTERNAL_STORAGE权限,引导用户开启「所有文件访问权限」后即可读取任意格式的公共存储文件,注意Google Play上架时需要提交该权限的使用说明,否则会被拒审。
问题2:应用数据库备份到可移除SD卡失效
Android 11 对可移除SD卡的公共目录写入做了限制,应用无法直接在SD卡根目录或自定义公共目录下创建、写入备份文件。
最优解决方案
使用可移除SD卡下的应用专属目录存储备份文件,无需申请任何权限:
- 调用
context.getExternalFilesDirs(null)获取存储路径数组,数组中第二个及之后的条目对应外置SD卡的应用专属目录 - 将数据库备份文件写入该目录下,用户通过MTP连接Windows后,可直接在SD卡的
Android/data/[你的应用包名]/files/路径下找到备份文件,手动拷贝到Windows即可
备选方案
若需要让用户自行选择备份文件的存储位置(无需进入应用专属目录查找),可调用ACTION_CREATE_DOCUMENT Intent,引导用户手动选择备份文件的保存路径(支持选择SD卡任意目录,也可直接导出到已连接的Windows设备),拿到返回的Uri后将数据库内容写入该Uri即可。
内容的提问来源于stack exchange,提问作者Earl Allen
相关产品推荐
相关产品推荐

