android文件管理器开发中遇到的一些问题

1.难点主要有如何获取外挂设备的信息以及路径无论是U盘还是TF卡等等

获取方式在其他博客中请自己查看。

2.在Android6.0中想要对外部设备进行的文件的操作是比较难的

因为6.0中Android系统对外部存储器操作的权限进行了修改,所以只能进行读操作,无法进行对外部设备的写操作,在翻看了大量的知识博客中,找的了相关的解决方法

Android 外部存储权限分析

不知道你有么有发现,来自菜鸟的成长史:http://blog.csdn.net/zjbpku/article/details/25161131,

KitKat之后的版本不再支持用户对外置SDcard(Secondary Storage)的写入等操作。如果用户想要将文件等copy到手机中,则只能

存储到内部存储器中,而无法存储到外置sdcard中,而且无法创建新的文件夹,这样一来给用户和开发者都带来了一定的不便。之所

以在KitKat之后版本中无法操作外置Sdcard,是因为Google更改了此模块的权限,以前我们可以直接获取WRITE_EXTERNAL_STORAGE

和READ_EXTERNAL_STORAGE权限来直接操作Sdcard,现在则不能,其目的是软件卸载时能将该软件创建的文件全部删除。据Google

员工Jeff SharKey(此模块的开发者)介绍,自Kitkat之后Anroid提供了新的API去访问Secondary External Storage,但这不是本文重点,本

文重点是分析外部存储权限是如何作用的。


在KitKat之前的Android版本会给应用程序单独分出一块外部存储空间(external storage),这块存储空间可能在sdcard

(可插拔的外置sdcaard)上,也可能在仅仅是在设备内部的闪存上,我们要获得WRITE_EXTERNAL_STORAGE权限在能对这块

空间进行访问,如果只是读取内容则不需要权限。在4.4 KitKat及之后的版本中,Google做了两个变化:1、进行读取时需要

READ_EXTERNAL_STORAGE权限;2、访问应用所属的目录下(如:android/data/[package name])存储的数据是不需要任

何权限的。


KitKat中,外部存储(external storage)被分割成了多个部分:一个“primary”部分,一个或多个“secondary”部分。在Kitkat之前的

API 可以用来操作 primary external storage,secondary external storage 是对write权限做了稍微修改,与上边所述一样,在应用所

所属的目录(如:android/data/[package name])下,对文件是有所有操作权限的,在应用所能管理到目录之外,该应用则不具有写

的权限,不能进行任何写的操作。这里也就引出了本文的重点。ps:Google虽然没有要求各厂商在Sdcard的操作上添加额外权限,但

是它却强制要求制造商对secondary external storage做了权限限制。如果你对Internal storage和external storage有疑问,可以看看文

档  https://developer.android.com/guide/topics/data/data-storage.html#filesInternal


根据Jeff SharKey 的介绍,当前版本的Android系统,也就是Kitkat,使用FUSE (Filesysgem in Userspace ) 对external storage进

行管理。为了在文件创建时获取必要的权限,动态地接受或拒绝来自用户/组的个别请求,会有一个Android 守护进程参与与FUSE 内核

驱动的交互。这仅仅是Android在FAT File System 格式化后的可移动卷上使用Linux型权限的一部分,在内核中它也允许使用超出基本的

owner/gouper/user 执行的多级权限控制。看看下面Jeff Sharkey的解释:


https://android.googlesource.com/platform/system/core/+/master/sdcard/sdcard.c


<uses-permission Android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
可以读写SDCARD,包括其他storage,比如内部flash,usb等等


4.0中如果只声明这个,会发现其他mount的设备有可能没有写权限,需要同时声明
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE"/>  
这样才可以读写/mnf/flash , /mnt/usb, /mnt/externa等目录


可能4.0增加了对其他存储设备的内建支持,其他设备不再共享gid "sdcard_rw"
而改用"media_rw",相应的细分了权限声明
2.3中 dr-xrwxr-x system   sdcard_rw          1969-12-31 16:00 flash
4.0中 d---rwxr-x system   media_rw           1970-01-01 08:00 flash

 来源:http://blog.csdn.NET/zmyde2010/article/details/7031461

也就是说程序得有"android.permission.WRITE_MEDIA_STORAGE"权限才可以写入外部SD卡/U盘

解决方法:

编辑 system\etc\permissions\platform.xml 文件(system文件夹必须是读写状态,就是点一下r/w 目录变成r/w),
此处:
    <permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
        <group gid="sdcard_rw" />
    </permission>
改为:
    <permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
        <group gid="sdcard_rw" />
        <group gid="media_rw" />
    </permission>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值