获取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”:
- 外部(不可移动)存储中 "cache" 文件夹的路径
- 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 对整个系统进行了更改。但这是一个不同的问题,我将在一个新问题中解决。
请在否决 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”:
- 外部(不可移动)存储中 "cache" 文件夹的路径
- 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 对整个系统进行了更改。但这是一个不同的问题,我将在一个新问题中解决。