Android P给App授予默认权限不需要权限弹框问题解决

给App默认授予权限的方法。

自从android 6.0之后,安卓加强了对权限的管理。上层App必须通过弹框申请权限,来让用户去选择时候授予选择。

但是在实际开发中,我们希望,app安装之后就可以直接使用,默认获取相关的权限,而不需要弹框请求权限。

第一种方法

将targetSdkVersion改成小于23,因为从23后,开始进行了权限限制

	    defaultConfig {
        applicationId "com.ad.audiotest"
        minSdkVersion 19
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

测试可行。

当targetSdkVersion>=23时,则无法默认获取权限。

第二种方法

frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
frameworks/base/core/res/res/values/arrays.xml
frameworks/base/core/res/res/values/symbols.xml

frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
在DefaultPermissionGrantPolicy.java中,加入:

private void grantDefaultSystemHandlerPermissions(int userId) {
	//省略一部分代码
	//...
	
	 //add by sunxiaolin start 20190905
	// add Storage permission
    grantStoragePermissionsToCustomApp(userId);
	//add by sunxiaolin end 20190905
	
	//省略一部分代码
	//...
}
//add by sunxiaolin start 20190905
private void grantStoragePermissionsToCustomApp(int userId){
    Log.i(TAG, "sunxiaolin,grantStoragePermissionsToCustomApp userId=" + userId);
    final String[] itemString = mContext.getResources()
        .getStringArray(com.android.internal.R.array.storage_permission_custom_packagename);
    for (int i = 0; i < itemString.length; i++) {
        PackageParser.Package customPackage = getPackage(itemString[i]);
        Log.i(TAG, "sunxiaolin,grantStoragePermissionsToCustomApp customPackage=" + customPackage);
        if ((customPackage != null) && doesPackageSupportRuntimePermissions(customPackage)) {
            grantRuntimePermissions(customPackage, STORAGE_PERMISSIONS, userId);
        }
    }
}
//add by sunxiaolin end 20190905

重点: grantRuntimePermissions(customPackage, STORAGE_PERMISSIONS, userId);中给app授权STORAGE_PERMISSIONS权限。

frameworks/base/core/res/res/values/arrays.xml

<!-- Add by sunxiaolin start 20190905 -->
<string-array name="storage_permission_custom_packagename">
<item>com.ad.audiotest</item>
</string-array>
<!-- Add by sunxiaolin end 20190905 -->

在item中加入你想授予STORAGE_PERMISSIONS权限的app包名。

frameworks/base/core/res/res/values/symbols.xml

<java-symbol type="array" name="storage_permission_custom_packagename" />

添加storage_permission_custom_packagename的定义,否则编译不过。

编译:/frameworks/base/services/下,mm,测试OK.

第三种方法

在system/etc/default-permissions目录下有一个文件:default-car-permissions.xml

在DefaultPermissionGrantPolicy中会去读这个文件,来给app赋予权限。

<exception
        package="com.android.car.messenger">
    <!-- Contacts -->
    <permission name="android.permission.READ_CONTACTS" fixed="false"/>

    <!-- SMS -->
    <permission name="android.permission.SEND_SMS" fixed="false"/>
    <permission name="android.permission.READ_SMS" fixed="false"/>
</exception>

<!-- add by sunxiaolin start 20190912 -->
<exception
        package="com.ad.audiotest">
    <!-- Contacts -->
    <permission name="android.permission.ACCESS_COARSE_LOCATION" fixed="false"/>

    <!-- SMS -->
    <permission name="android.permission.WRITE_EXTERNAL_STORAGE" fixed="false"/>
    <permission name="android.permission.READ_PHONE_STATE" fixed="false"/>
</exception>
<!-- add by sunxiaolin end 20190912 -->

在里面加入你想赋予权限的app包名和权限。

其中第二种和第三种方法可以清楚存储空间中可以看到。

并且只对于默认打包在系统中的Image生效。对于第三方应用,需要修改下代码逻辑。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaolin2016

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值