请在投票前阅读整篇文章和/或将其标记为副本!
我正在开发一个应用程序,用于从用户手机上的特定文件夹中读取文件 - 从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卡的路径(不对其进行硬编码)?
答案 0 :(得分:4)
我发现的唯一方法是对其进行半硬编码:
File[] folders = myappcontext.getExternalCacheDirs();
为您提供应用有权访问的“缓存”文件夹的路径(但在卸载应用时会将其删除)。
如果手机使用可移动SD卡(当前已安装),则阵列长度应为“2”:
它们看起来像这样:
/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>