getExternalStorageDirectory().getPath() return 什么时候不是“/sdcard/”?

When does getExternalStorageDirectory().getPath() return something else than "/sdcard/"?

我从 android lint 收到警告:

Do not hardcode "/sdcard/"; use Environment.getExternalStorageDirectory().getPath() instead

我会解决这个问题,但仍然需要知道:

这是哪个(示例)设备上的问题,您可以从此调用中获得哪些其他(示例)路径?如果这与特定设备无关,它具体是什么或什么时候会发生?

在什么情况下没有/sdcard/我的应用程序可以写入的目录?

应用拥有权利

<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

what other (example) paths can you get from this call?

部分是厂家要什么就什么

部分地,它会根据 运行 您的应用的用户帐户而有所不同。请记住,几年来(自 Android 4.2 发布以来),Android 设备可以拥有多个用户帐户(平板电脑从 4.2 开始,手机从 5.0 开始)。每个用户都有一个不同的内部和外部存储位置,并且无法保证这些位置指向的实际文件系统路径。

永远不要硬编码根路径到内部或外部存储。始终使用适当的方法获取根位置,然后使用适当的 File 构造函数指向其中的任何内容。

The app has the rights

由于Android中没有WRITE_INTERNAL_STORAGE权限,请移除。

外部存储可能指向其他地方,

您可以定义并挂载其他地方作为设备外部存储,

这是一个配置选项,这就是为什么您会收到 Lint 警告。

例如,如果设备支持外部SD卡,则外部SD卡(getExteranlStorage())将指向他(外部SD卡将安装在/nmt/sdcard#/),顶部保持内部SD卡空闲.

说清楚

/sdcard/ == /mnt/sdcard[0] -> 内部sdcard

其他 sdcard 将安装在 /mnt/sdcard[1..]/ -> 外部 sdcard

而且设备的制造商可以随意调用它(/sdcard/只是一个约定,不是必须的)

不同Android厂商的SD卡路径不同。所以我用我朋友的 sdcard 在他们 phone 上进行了自己的研究。结果:

索尼 XPERIA X10i(我的phone)

  • Android 2.3.3(姜饼)
  • phone 内部存储器的路径:not available
  • SD 卡路径:/mnt/sdcard/

Samsung Galaxy S3 Mini 和 Samsung Galaxy Young(给出相同的结果)

  • Android 4.2.2(果冻豆)
  • phone 内部存储器的路径:/storage/sdcard0/
  • SD 卡路径:/storage/extSdCard/

OPPO(不记得她phone是什么类型了)

  • Android 4.2.2(果冻豆)
  • phone 内部存储器的路径:/storage/sdcard0/external_sd/
  • SD 卡路径:/sdcard0/

我把结果写在书里了。所以我的建议是,永远不要使用 hardcode 作为 sdcard 的路径。检查 here 以了解您的 SD 卡的路径。