怎么给预置应用默认赋予动态权限?

[QUESTION]
怎么给预置应用默认赋予动态权限?

[ANSWER]

请注意,我们给出的方案会导致google GTS权限相关的case测试失败!如果需要过GTS测试的话请不要使用该方案。

    Android6.0上新加了runtime权限机制。Android对于normal型的权限在安装应用时会默认授予权限,而对于一些重要的dangerous权限如STORAGE、LOCATION等,除非在framework层中默认赋予了权限,如果要使用这些权限的话需要在应用运行时弹出提示框让用户确认授予这些权限。

dangerous权限分为9个组:

 CALENDAR 组:

     READ_CALENDAR
     WRITE_CALENDAR
 CAMERA组:
     CAMERA
 CONTACTS组:
     READ_CONTACTS
     WRITE_CONTACTS
     GET_ACCOUNTS
 LOCATION组:
     ACCESS_FINE_LOCATION
     ACCESS_COARSE_LOCATION

 MICROPHONE组:
     RECORD_AUDIO
 PHONE组:
     READ_PHONE_STATE
     CALL_PHONE
     READ_CALL_LOG
     WRITE_CALL_LOG
     ADD_VOICEMAIL
     USE_SIP
     PROCESS_OUTGOING_CALLS
 SENSORS组:
     BODY_SENSORS
 SMS组:
     SEND_SMS
     RECEIVE_SMS
     READ_SMS
     RECEIVE_WAP_PUSH
     RECEIVE_MMS
 STORAGE组:
     READ_EXTERNAL_STORAGE
     WRITE_EXTERNAL_STORAGE

 

 请注意,本方案要求应用必须是预置在版本中的,对用户后面自己安装的应用不适用。

 

在使用本方案时,请先确定您的pac包版本是否是CMCC版本,确定方法:手机连上电脑,adb shell , cd system/etc/ ,查看当前目录下有没有sprd-app-perms.xml文件,有的话说明是CMCC版本,否则不是。

    1、针对CMCC版本,可以在源码的sprd-app-perms.xml文件中做配置然后整体编译即可。 sprd-app-perms.xml文件的位置在源码下的vendor/sprd/operator/cmcc/permission/ 目录下,该文件中的作用是给指定的应用赋予指定的runtime动态权限。sprd-app-perms.xml的内容如下:

<?xml version='1.0' encoding='utf-8' ?>

 <perms>
    <package name="com.android.launcher3"> 

        <use-perm name="android.permission.READ_PHONE_STATE" />
        <use-perm name="android.permission.READ_SMS" />
    </package>

</perms>

可以参照上面的launcher3的格式做修改如下所示

<?xml version='1.0' encoding='utf-8' ?>

 <perms>
    <package name="com.android.launcher3"> 

        <use-perm name="android.permission.READ_PHONE_STATE" />
        <use-perm name="android.permission.READ_SMS" />
    </package>

    <package name="com.android.XXX"> 

        <use-perm name="android.permission.XXX" />
        <use-perm name="android.permission.XXX" />
    </package>

</perms>

其中package name项com.android.XXX改为APK的包名,use-perm name项 android.permission.XXX中改为该APK需要使用的runtime权限的名称(只需要配置上面9个group中的权限,其余的非动态权限会被自动授权所以不用考虑)。   

     配置好后可以便可以整体编译,烧pac包至手机中,开机后可以打开 设置-->应用-->该应用-->权限,查看配置的权限开关是否已经打开。如果出现应用的权限部分出现灰显状态(跟Setting应用的逻辑有关,该应用配置了shareduserId),,可以使用命令 adb shell dumpsys package 该应用的包名> dumpsys.txt ,打开dumpsys.txt文件,看看"runtime permissions" 那一行下面如果出现类似 "android.permission.READ_EXTERNAL_STORAGE: granted=true "这样的内容即说明该权限已经被默认授权。

 

 

 2、针对非CMCC版本

解决方案分为以下三个步骤:

(1)在sprd-app-perms.xml文件中配置需要赋予动态权限的应用的包名。

    类似地,在源码下的vendor/sprd/operator/cmcc/permission/ sprd-app-perms.xml文件中参照launcher3的格式做修改。请注意,把从<package name="com.android.launcher3"> 到    </package>间的原来的内容删除!

sprd-app-perms.xml文件最后的内容为:

<?xml version='1.0' encoding='utf-8' ?>

 <perms>

    <package name="com.android.XXX"> 

        <use-perm name="android.permission.XXX" />
        <use-perm name="android.permission.XXX" />
    </package>

</perms>

其中package name项com.android.XXX改为APK的包名,use-perm name项android.permission.XXX中改为该APK需要使用的runtime权限的名称(只需要配置上面9个group中的权限,其余的非动态权限会被自动授权所以不用考虑)。   

(2)您需要在源码的device/sprd/scx35l/common目录下打开所有的.mk文件,找到包含PRODUCT_COPY_FILES的那几个,由于我们不清楚您那边的目录结构,所以需要您下面的代码加到其中的一个.mk文件的结尾中(可以先试device.mk),

DEFAULT_RUNTIME_PERMISSION_FILES := vendor/sprd/operator/cmcc/permission/sprd-app-perms.xml
ifneq ($(wildcard $(DEFAULT_RUNTIME_PERMISSION_FILES)),)
PRODUCT_COPY_FILES += \
    $(DEFAULT_RUNTIME_PERMISSION_FILES):system/etc/sprd-app-perms.xml
endif

整体编译后看源码out目录的system/etc目录下是否生成sprd-app-perms.xml,生成的话说明修改生效走下一步,否则请在另外的.mk文件中修改,再做同样的操作;

(3)配置好后可以便可以整体编译,烧pac包至手机中,开机后可以打开 设置-->应用-->该应用-->权限,查看配置的权限开关是否已经打开。如果出现应用的权限部分出现灰显状态(跟Setting应用的逻辑有关,该应用配置了shareduserId),可以使用命令 adb shell dumpsys package 该应用的包名> dumpsys.txt ,打开dumpsys.txt文件,看看"runtime permissions" 那一行下面如果出现类似 "android.permission.READ_EXTERNAL_STORAGE: granted=true "这样的内容即说明该权限已经被默认授权。

    以上就是给预置应用默认赋予动态权限方案的完整内容。

请注意,我们给出的方案会导致google GTS权限相关的case测试失败!如果需要过GTS测试的话请不要使用该方案。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值