获取SD卡的路径

5
请在将此帖子下投票或标记为重复之前阅读整个帖子!
我正在开发一款应用程序,它从用户手机中的特定文件夹读取文件 - 无论是从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卡的路径(无需硬编码)?


可以使用Environment.getExternalStorageDirectory()函数。一直跟随父文件夹,直到找到/sdcard/ - FindOutIslamNow
上移一行。就像我说的:请阅读整篇文章! - Neph
没关系,它确实返回“true”,但是在没有SD卡的S7上也是如此,所以回到原点。 :/ - Neph
重复问题 https://dev59.com/ZG025IYBdhLWcg3w960W - LarsH
1
@LarsH,这是一个非常相似的问题,你说得对,但它已经有7年了,而且关于一个更旧的Android版本 - 我问的是关于Android 7.0的,其中访问SD卡上的文件与Android 4.3完全不同。 - Neph
显示剩余6条评论
2个回答

10
我找到的唯一方法是半硬编码它:
File[] folders = myappcontext.getExternalCacheDirs();

该函数会返回应用程序可以访问的“缓存”文件夹的路径(但在卸载应用程序时会被删除)。

如果手机使用可移除的SD卡(当前已挂载),则数组的长度应为“2”:

  1. 外部(不可移除)存储中“缓存”文件夹的路径
  2. SD卡上“缓存”文件夹的路径

它们看起来像这样:

/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”文件夹,但是由于Kitkat带来的整个系统变化,在Android 7上您无法在该文件夹中写入(会抛出“访问被拒绝”的异常)。但这是我将在新问题中解决的另一个问题。

这些是找到可移动SD卡的好方法(因为没有更好的方法)。对于更强大的方法,跨越更多的Android版本和制造商,请参见https://dev59.com/ZG025IYBdhLWcg3w960W#54411385。 - LarsH

-1

你需要将以下权限插入到你的应用清单文件中:

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

1
请阅读整篇文章!权限已经在我的清单文件中提到(包括代码中的许可弹出窗口),否则在我尝试更改之前它就不会起作用,因此它也可以处理SD卡。 - Neph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接