WRITE_MEDIA_STORAGE/WRITE_EXTERN

作者: android之子 | 来源:发表于2017-09-30 11:35 被阅读1384次

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

    相关文章

      网友评论

        本文标题:WRITE_MEDIA_STORAGE/WRITE_EXTERN

        本文链接:https://www.haomeiwen.com/subject/wqsgextx.html