【问题标题】:Getting the path to SD card获取 SD 卡的路径
【发布时间】:2018-10-12 10:51:44
【问题描述】:

请在投反对票和/或将其标记为重复之前阅读整篇帖子!

我正在开发一个应用程序,该应用程序可以从用户手机上的特定文件夹中读取文件 - 无论是从 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/
  • 请阅读整篇文章!我的第一个测试已经给了我“/sdcard”,但即使我使用“我的文件”应用程序直接在其中创建了“myfolder”文件夹,第三个测试还是失败了。
  • 我可以看到您正在使用 SECONDARY_STORAGE 来检查您的文件夹,而不是 EXTERNAL_STORAGE
  • 上一行。就像我说的:请阅读整篇文章!
  • @LarsH 这是一个非常相似的问题,你是对的,但它已经有 7 年的历史了,而且是关于一个更旧的 Android 版本 - 我问过 Android 7.0,其中可以访问 SD 卡上的文件与例如完全不同的方式安卓 4.3。

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


【解决方案1】:

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

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”文件夹,但您不能在其中写入(Android 7 只会引发“访问被拒绝”异常),因为整个系统的更改和奇巧一起来。但这是一个不同的问题,我将在一个新问题中解决。

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • 请阅读整篇文章!我的清单文件中已经提到了该权限(包括我的代码中的权限弹出窗口),否则在我尝试更改它之前它首先不起作用,因此它也可以处理 SD 卡。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 2012-11-22
  • 1970-01-01
  • 2020-03-26
相关资源
最近更新 更多