Android 6.0 中使用外部SD卡的路径变化及解决方法

6次阅读
没有评论

问题描述

最近开始使用 Android 6.0 后发现,外部 SD 卡不再直接挂载在 /storage/extSdCard 路径下。而是挂载在一个以卷ID命名的目录中(如 /storage/some-volume-id),这意味着许多依赖于 extSdCard 路径的应用程序现在无法正确访问数据了。

尝试使用 ln -s /storage/some-volume-id /storage/extSdCard 命令创建符号链接,虽然 root 用户可以正常使用。但普通用户或其它应用程序仍无法识别和使用这个符号链接。

解决方案

方案1:使用Android文件访问API

注意:此方法适用于不需要修改系统底层操作的正常应用开发或定制ROM。
针对依赖特定路径的应用程序,可以从 Android API 模型出发解决。例如,许多现代基于 Android 的应用程序都会用 Environment.getExternalStorageDirectory() 或其它环境变量来表示 SD 卡的位置,而不是直接使用固定的路径。

  • 对于不支持这种 API 的老旧代码,请参考 Android 支持指南进行转换。
  • 创建一个自定义的文件路径选择器或其他类似功能的工具以便在开发中灵活切换不同的存储路径(系统内部、外部SD卡等)。

方案2:修改ROM底层以允许创建符号链接

需要针对个人设备安装root权限。
某些情况下,普通用户可能尝试通过 root 来解决路径问题。然而,正如回复所述,在未经正式授权的 Android 设备上调用系统级文件操作往往受限制或被阻止。

  • 使用 busybox 或其他具有相同功能集的工具包进行符号链接创建,并确保执行上下文有适当的权限。
    su
    ln -s /storage/some-volume-id /storage/extSdCard

  • 修改 /system/bin/ln,允许非 root 用户使用此命令。这通常涉及编写和安装可替换的二进制文件到正确的系统目录下。

方案3:采用静态映射解决方案(可能不适用)

创建一个设备特定的脚本来将旧路径重定向到新位置,从而使得某些外部应用保持一致的访问行为:
– 修改 /system/etc/init.d/ 目录下的脚本,或者利用 SELinux 策略文件进行定制设置,间接实现路径映射的目的。

额外建议

  • 了解设备规范:确认当前设备是否允许普通用户创建自定义符号链接。
  • 官方文档与社区交流:参与开发者论坛或向官方反馈遇到的问题,并参考最新 Android 设计指南以确保兼容性和可维护性。

以上方法各有优缺点及适用场景,需根据具体需求和环境选择最合适的方案。在操作前建议仔细评估所有步骤的风险以及对系统稳定性的影响。

正文完