如何为 Android 应用程序获取外部 SD 卡写权限
如果你正在开发一个需要访问外部存储的 Android 应用程序,并且遇到了在安装或运行过程中缺少 WRITE_EXTERNAL_STORAGE
权限的问题,那么你可能需要采取额外步骤以获得写入权限。由于 Google 对该权限的要求逐渐严格化,特别是对于新应用(需通过申请才能获取),我们这里将介绍一种工作绕过方法。
一、背景:理解 Android 卷帘库与 Termux 的关系
首先,有必要了解几个关键概念和组件:
1. 卷帘库: Google 在 Android 9(Pie)推出的一个 API 特性,旨在改善应用对设备硬件的访问权限。这主要包括蓝牙、Wi-Fi 和存储权限。
2. Termux Terminal App:这是一个运行在 Termux 环境中的安卓终端模拟工具包。由于它自身是一个使用虚拟文件系统的独立应用程序(名为“共享用户”),因此无法直接获得外部 SD 卡写入的权限。
二、问题描述
当你尝试获取 Termux 的 WRITE_EXTERNAL_STORAGE
权限时,如果遇到了权限被拒绝的问题,你需要进行手动干预来增加必要的权限条目。以下是具体的解决步骤:
- 备份现有的 packages.xml 文件:
使用命令
cp packages.xml /storage/emulated/0/tmp
做一份当前的packages.xml
的备份。打开编辑器修改 packages.xml 文件:
你可以使用 Termux 中内建的文本编辑工具,不过推荐的方式是将文件复制到一个容易访问的位置并手工修改。具体命令如下:
bash
cp /data/data/com.termux/files/usr/etc/packages.xml /storage/emulated/0/tmp/pacakges.xml查找与 Termux 对应的权限声明:
在备份文件中查找 Termux 应用对应的共享使用权
<shared-user>
节点。插入一个全新的写外部存储权限声明:
找到该
<item name="android.permission.WRITE_EXTERNAL_STORAGE" granted="false" flags="0" />
的位置,将其复制并粘贴在其下方,然后修改name
属性以指向你想要给予写权限的应用。设置新的权限为
WRITE_MEDIA_STORAGE
:按照以下格式调整新插入的条目:
<item name="android.permission.WRITE_MEDIA_STORAGE" granted="true" flags="0" />
替换并保存文件:
- 使用以下命令进行替换:
bash
cp /storage/emulated/0/tmp/packages.xml packages.xml 切勿使用
mv
命令,因它不能确保正确的权限设置。验证修改有效性 & 执行相关操作:
重新启动 Termux 并检查新应用的存储写入是否生效。
最终检查与重启确认:
- 运行
diff packages.xml packages.xml.orig1
(或者其它文件名)以确保未出现错误。最后别忘了移除或回滚任何临时更改,然后安全重新启动您的手机。
三、注意事项
- 尽管上述方法在某些情况下能成功解决问题,但它依然存在一定的风险。
- 这个过程可能会导致某些不预期的结果。
- 在实际操作前建议确保备份重要数据,并详细阅读官方文档指导。如有不对之处,请根据最新的 Android 和 Termux 版本做必要调整。
总结来说,在正式发布应用前请尽量请求用户明确授予必要的外部存储权限,避免采用如上这样临时且危险的处理方法。