获取SD卡的路径

时间:2018-05-02 10:45:51

标签: android android-sdcard sd-card android-7.0-nougat android-external-storage

请在投票前阅读整篇文章和/或将其标记为副本!

我正在开发一个应用程序,用于从用户手机上的特定文件夹中读取文件 - 从SD卡(如果有)或从内置存储中读取。是的,清单中提到了“READ_EXTERNAL_STORAGE”,我还处理了API> 23的权限弹出窗口。

我以前只是使用

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

获取存储在内置存储中的文件夹的路径(S7的32gb),但现在我想获取SD卡的路径。根据谷歌给我的几乎所有结果,“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());

令我惊讶的是,这两部手机都输出相同的信息:

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

根据文件管理器应用程序(“我的文件”),内置存储称为“内部存储”,这更不合理(我知道Android中内部和外部存储的区别)。

如何获取实际SD卡的路径(不对其进行硬编码)?

2 个答案:

答案 0 :(得分:4)

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

File[] folders = myappcontext.getExternalCacheDirs();

为您提供应用有权访问的“缓存”文件夹的路径(但在卸载应用时会将其删除)。

如果手机使用可移动SD卡(当前已安装),则阵列长度应为“2”:

  1. 外部(不可移动)存储中“cache”文件夹的路径
  2. SD卡上“缓存”文件夹的路径
  3. 它们看起来像这样:

    /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”文件夹,但你不能在其中写入(因为整个系统的变化,只会在Android 7中抛出“拒绝访问”)。 Kitkat来了。但这是一个不同的问题,我将在一个新问题中解决。

答案 1 :(得分:0)

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

<?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>