WRITE_MEDIA_STORAGE/WRITE_EXTERN
这两种配置对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(