Android外部存储ExternalStorage
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android外部存储ExternalStorage相关的知识,希望对你有一定的参考价值。
参考技术A 内存(emory)内部存储(ternalStorage)
1)storage或者mnt文件夹下
2) 通过:
Environment.getExternalStorageDirectory()
可以看到外部存储的位置
3) 公有目录(DCIM、DOWNLOAD等),要使用需要申请权限。
4) 私有目录(Android/data/应用包名),只能被当前应用访问。
String path= Environment.getExternalStorageDirectory().getAbsolutePath() +"/Mytest.txt";
try
if (!file.exists())
file.createNewFile();
catch (IOException e)
e.printStackTrace();
try
if (!file.exists())
file.createNewFile();
FileOutputStream fos=new FileOutputStream(path,true);
String str=infoEdt.getText().toString();
fos.write(str.getBytes());//以字节流的方式写入
catch (IOException e)
e.printStackTrace();
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
其中第二条权限可能会报错,这时候解决办法是:
在报错的地方添加
tools:ignore="ProtectedPermissions"
同时在manifest标签里添加;
xmlns:tools="http://schemas.android.com/tools"
FileInputStream fis =new FileInputStream(path);
byte[] b =new byte[1024];
int len = fis.read(b);//读取fis字节流,将其存储在字节数组b中,并返回数组的长度(字节的个数)
String str2=new String(b,0,len);
txt.setText(str2);
注意:1、从外部存储读取文件不需要权限
2、Android6.0以上对外部存储(内存卡)共有目录的读写需要运行时权限(允许访问内存卡),这个权限需要用户手动开启,只在AndroidManifest.xml中申请是没用的。
int permissionContextCompet.checkSelfPermission(context,permission) 检查是否具有权限
第一个参数,环境上下文(this),第二个参数,权限名,Manifest.permission.WRITE_EXTERNAL_STORAGE,返回的是一个int类型的变量,将其与PackageManger.PERMISSION_GRANTED比较,等于则说明有权限,不等于的话则要动态申请权限:
if(permission!= PackageManager.PERMISSION_GRANTED)
//没有权限,则要申请权限
ActivityCompet.reaquestPermissions(activity,permission,code) 请求权限,第一个参数:activity 第二个参数:String类型的数组,里面装了各种权限, 当有多项权限需要申请的时候可以一起申请,第三个参数:一个int类型的请求码,动态申请权限的时候会触发onRequestPermissionsResult()方法,如果在申请的过程中有什么需要做的操作可以定义在该方法中,第三个参数请求吗可以帮助知道是那个权限的申请触发了这个方法
int permission=ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if(permission!= PackageManager.PERMISSION_GRANTED)
ActivityCompat.requestPermissions(this,new String[]Manifest.permission.WRITE_EXTERNAL_STORAGE,1);
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode==1)
//当前没有什么要处理的
通过:Environment.getExternalStorageDirectory()获取到的是根目录,通过在后面拼接目录名称,可以访问到公有目录
要获取外部存储目录的私有目录,可以通过:
1)Context.getExternalFilesDir(String type)获取到SDCard/Android/data/包名/files/目录,这个目录下一般存放一些需要长时间保存的数据。这个参数是用于指定文件夹类型的(图片,音乐,视频...)。
2)Context。getExternalCacheDir()获取到SDCard/Android/data/包名/cache/目录,这个目录下面一般存放一些临时的缓存性的数据。
一些 Android 设备将内部存储视为 SD 卡,将外部存储视为 EXTSD
【中文标题】一些 Android 设备将内部存储视为 SD 卡,将外部存储视为 EXTSD【英文标题】:Some Android devices treat Internal Storage as SD Cards and External Storage as EXTSD 【发布时间】:2013-03-03 18:20:35 【问题描述】:我有很多来自不同供应商的 Android 设备。
其中一些将 /mnt/sdcard 附加到内部存储,将 /mnt/extsd 附加到 外部存储(场景 1)和其他将 /mnt/sdcard 附加到外部存储(场景 2)
我认为第二种情况是标准的,因为 Android API 提供了此路径的句柄。现在的问题是,在场景 1 中,/mnt/extsd
变为 readonly
,即使有 WRITE_EXTERNAL_STORAGE
权限!
这意味着我只能从实际的外部 sd 卡中读取数据而无法写入。
是否有解决方法,以便我可以写入 extsd 文件夹?
【问题讨论】:
最好向这个社区提问:android.stackexchange.com 【参考方案1】:Environment.getExternalStorageState() returns path to internal SD mount point like "/mnt/sdcard"
Environment.getExternalStorageDirectory()
指的是设备制造商认为的“外部存储”。在某些设备上,这是可移动媒体,例如 SD 卡。在某些设备上,这是设备上闪存的一部分。在这里,“外部存储”是指“安装在主机上时通过 USB 大容量存储模式访问的东西”,至少对于 Android 2.x 及更高版本。
But the question is about external SD. How to get a path like "/mnt/sdcard/external_sd" (it may differ from device to device)?
如上所述,除了外部存储之外,Android 没有“外部 SD”的概念。
如果设备制造商选择将外部存储设备作为板载闪存并且还有 SD 卡,则您需要联系该制造商以确定您是否可以使用 SD 卡(不保证)以及使用它的规则,例如使用什么路径。
【讨论】:
【参考方案2】:到目前为止,我发现在设备上获得写访问权的唯一解决方法是使设备生根:(
三星提供了一个清单条目的解决方法
更多详情请点击以下链接
http://www.xda-developers.com/android/android-3-2-code-inadvertently-preventing-write-access-to-external-storage/
和
http://www.chainfire.eu/articles/113/Is_Google_blocking_apps_writing_to_SD_cards_/
摘录:
Google 的 AOSP 代码中似乎存在一个错误,即 围绕 Android 3.2 引入,这会影响操作系统处理 USB 的方式 存储并可以防止对 SD 卡和 USB 记忆棒的写访问。 XDA 精英认可的开发者、高级版主和新闻撰稿人 Chainfire 在他的博文中总结了这个问题:
“过去,应用会请求“WRITE_EXTERNAL_STORAGE” 权限,这将授予对所有外部存储的写访问权限 (用户/组“sdcard_rw”)。这显然已更改为仅 授予对主要外部存储的写访问权限。一秒 引入了名为“WRITE_MEDIA_STORAGE”的权限,其中 将授予对其他外部存储的访问权限(用户/组 “media_rw”)。
问题是,第三方实际上不会被授予此权限 权限,仅限系统应用和设备提供的应用 制造商通常会获得此许可。有 例外,显然在某些设备上第三方应用程序将 授予此权限,但根据 AOSP 消息来源,他们是 当然不应该。”
【讨论】:
在有根设备上,你将如何解决这个问题?例如Cubieboard默认root,内部SD很小但应用程序默认无法写入外部SD【参考方案3】:在根设备上,您可以更改 /system/etc/permissions/platform.xml 以“修复”权限问题。以下对我有用:
adb pull /system/etc/permissions/platform.xml修改 platform.xml,使 media_rw 包含在 WRITE_EXTERNAL_STORAGE 权限中,如下所示:
<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
<group gid="sdcard_rw" />
<group gid="media_rw" />
</permission>
adb push platform.xml /system/etc/permissions/platform.xml
重启设备【讨论】:
谢谢,这是为我做的。我不明白为什么 Google 会强制执行这样的权限限制。 这是一个用户解决方案,而不是开发者解决方案。以上是关于Android外部存储ExternalStorage的主要内容,如果未能解决你的问题,请参考以下文章
Android数据存储(External Storage,外部存储)