获取SD卡路径

Getting the path to SD card

请在否决 and/or 将其标记为重复之前阅读整个 post!

我正在开发一个应用程序,它可以从用户 phone 上的特定文件夹中读取文件 - 从 SD 卡(如果有的话)或从内置存储中读取。是的,清单中提到了 "READ_EXTERNAL_STORAGE",我还在处理 API>23.

的权限弹出窗口

我以前只是简单地使用

File folder = new File(Environment.getExternalStorageDirectory(), "myfolder");

获取存储在内置存储器中的文件夹路径(S7 为 32gb),但现在我想获取 SD 卡的路径。根据 google 给我的几乎所有结果,"Environment.getExternalStorageDirectory()" 应该给你 SD 卡的路径,但对我来说它没有(而且从来没有)。

我用两台不同的三星 Galaxy S7 测试了以下内容,都带有 Android 7.0,一个带有 SD 卡(+ 文件夹),另一个没有(+ 文件夹):

Log.d(tag, System.getenv("EXTERNAL_STORAGE"));
Log.d(tag, System.getenv("SECONDARY_STORAGE"));
Log.d(tag, ""+new File(System.getenv("EXTERNAL_STORAGE")+File.separator+"myfolder").isDirectory());
Log.e(tag, ""+new File(System.getenv("EXTERNAL_STORAGE")+File.separator+ordner).getAbsolutePath());
Log.d(tag, Environment.isExternalStorageRemovable());
Log.d(tag, Environment.getExternalStorageDirectory());
Log.d(tag, Environment.getExternalStorageDirectory().getAbsolutePath());

令我惊讶的是,phone 都输出相同的信息:

/sdcard
null
true
/sdcard/myfolder
false
/storage/emulated/0
/storage/emulated/0

根据文件管理器应用程序("My Files"),内置存储称为"Internal Storage",这更没有意义(我知道内部和外部存储之间的区别Android).

如何获取实际 SD 卡的路径(无需硬编码)?

您必须在应用程序的清单文件中插入以下权限:

<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android" >

   <!-- Add this -->
   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

</manifest>

我发现的唯一方法是对其进行半硬编码:

File[] folders = myappcontext.getExternalCacheDirs();

为您提供您的应用可以访问的 "cache" 个文件夹的路径(但当您卸载您的应用时,这些文件夹将被删除)。

如果phone使用可移动SD卡(当前已安装),则数组的长度应为“2”:

  1. 外部(不可移动)存储中 "cache" 文件夹的路径
  2. SD 卡上 "cache" 文件夹的路径

它们看起来像这样:

/storage/emulated/0/Android/data/com.mycompany.myapp/cache
/storage/xxxx-xxxx/Android/data/com.mycompany.myapp/cache

... 其中 "x" 是您的 SD 卡的编号(ID?)。我只能用 2 张不同的 SD 卡对其进行测试,并且它们都有自己的编号。

Environment.getExternalStorageDirectory();

应该也给你

/storage/emulated/0/

这是访问外部存储的非硬编码方式。 ;)

如果您在 PC 上的 SD 卡的第一层创建一个新文件夹,其路径将为:

/storage/xxxx-xxxx/myfolder

我还要警告你:虽然你可以读取 "myfolder" 文件夹,但你不能在其中写入(只会抛出一个 "Access Denied" 异常 Android 7)因为 Kitkat 对整个系统进行了更改。但这是一个不同的问题,我将在一个新问题中解决。