程序员Android开发经验谈Android开发

WRITE_MEDIA_STORAGE/WRITE_EXTERN

2017-09-30  本文已影响1384人  android之子

这两种配置对SDCARD的权限控制是不一样的。

合并分区:按照谷歌4.4的要求,把sdcard,U盘等外部存储器的权限设置为uid= AID_SYSTEM gid=AID_MEDIA_RW,mask是0002.。 这样就要求要对sdcard等有写权限必须要持有这个permission。

<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />

这个permission对应的group信息是在frameworks/base/data/etc/platform.xml 中定义的

<permission name="android.permission.WRITE_MEDIA_STORAGE" >

<group gid="media_rw" />
</permission>

这个permission是4.4中新增的,并且是不推荐使用的。

非合并分区:为了方便使用并且兼容4.2之前的APK,我们把sdcard,u盘的权限设置为uid= AID_SYSTEM gid=AID_SDCARD_RW,mask是0002.。 这样就要求要对sdcard等有写权限必须要持有

这个permission对应的group信息是在frameworks/base/data/etc/platform.xml 中定义的


<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >

这个permission是4.2之前就开始使用的,大家都比较熟悉。

修改方法:

<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >

<group gid="sdcard_r" />
<group gid="sdcard_rw" />
</permission>

其他方案上使用了如下方法绕过这个问题,但是我是不建议使用的

就是在frameworks/base/data/etc/platform.xml 中作如下修改

即把WRITE_MEDIA_STORAGE这个permission对应的group也赋值到WRITE_EXTERNAL_STORAGE这个权限中,也即是说WRITE_MEDIA_STORAGE这个权限的控制效果失效了。

注意:这个permission要求使用platform签名即在Android.mk中要增加如下:

+LOCAL_CERTIFICATE := platform

这样修改之后GMS包中的APK,以及第三方的APK就可以删除sdcard中的文件了。但是Android系统中对openOutputStream还是有限制的,不允许用openOutputStream 保存文件到非主存储器上。

现象是:GMS包中的Photo这个APK不能保存编辑过的sdcard中的图片。

修改方法如下:

--- a/src/com/android/providers/media/MediaProvider.java

+++ b/src/com/android/providers/media/MediaProvider.java

@@ -4787,10 +4787,10 @@ public class MediaProvider extends ContentProvider {

c.enforceCallingOrSelfPermission(

ACCESS_CACHE_FILESYSTEM, "Cache path: " + path);

}

- } else if (isWrite) {

+ }/* else if (isWrite) {

// don't write to non-cache, non-sdcard files.

throw new FileNotFoundException("Can't access " + file);

- } else if (isSecondaryExternalPath(path)) {

+ } */else if (isSecondaryExternalPath(path)) {

// read access is OK with the appropriate permission

if (!readGranted) {

c.enforceCallingOrSelfPermission(

上一篇下一篇

猜你喜欢

热点阅读