繁体   English   中英

获取SD卡的路径

[英]Getting the path to SD card

请在否决和/或将其标记为重复之前阅读整篇文章!

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

我曾经简单地使用

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

获取存储在内置存储器(S7为32gb)中的文件夹的路径,但是现在我想获取SD卡的路径。 根据Google给我的几乎所有结果,“ Environment.getExternalStorageDirectory()”应该为您提供SD卡的路径,但对我而言却没有(而且从来没有)。

我已经使用两种不同的Samsung Galaxy S7(分别使用Android 7.0,一种带有SD卡(+文件夹),另一种没有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卡的路径(不对其进行硬编码)?

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

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只会抛出“ Access Denied”异常) 。 但这是另一个问题,我将在一个新问题中解决。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM