Android 运行时权限解读Permission

本文详细解析了Android运行时权限管理,包括判断系统版本、检查权限状态、请求权限流程以及处理回调。特别讨论了SYSTEM_ALERT_WINDOW和WRITE_SETTINGS两个特殊权限的授权方法,通过startActivityForResult启动授权界面并检测授权结果。提供了完整的代码示例和GitHub项目链接,以应对不同机型的权限适配问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天项目中,遇到一个问题:运行时权限:当用户在小米手机上拒绝过一次后,下次再需要此权限,并不会再次进行请求权限。后查阅的出:小米手机再用户第一次拒绝 后,默认勾选了“不再提示”选项。
遂:将权限全面的剖析,进行多机型适配,以备录。

1、判断系统版本--Build.VERSION.SDK_INT

2、检查时候开启权限--checkSelfPermission
3、是否显示请求权限提示--shouldShowRequestPermissionRationale
4、请求权限---requestPermission
5、请求处理:
1、实现--OnRequestPermissionsResultCallback
               
2、处理--回调方法

项目github链接: 点击打开链接

[补充注意点]
1、有以下特殊权限,需要不同的操作。
2、SYSTEM_ALERT_WINDOW,设置悬浮窗,进行一些黑科技
WRITE_SETTINGS 修改系统设置
3、关于上面两个特殊权限的授权,做法是使用startActivityForResult启动授权界面来完成。
request:
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE);

result:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_CODE){
if(Settings.canDrawOverlays(this)){
Log.i(TAG, "onActivityResult granted"):
}
}
}



3.2
1.使用Action Settings.ACTION_MANAGE_OVERLAY_PERMISSION启动隐式Intent
2.使用"package:" + getPackageName()携带App的包名信息
3.使用Settings.canDrawOverlays方法判断授权结果

4、
request:
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE_WRITE_SETTINGS);

result:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_CODE_WRITE_SETTINGS){
if(Settings.System.canWrite(this)){
Log.i(TAG, "onActivityResult write settings granted");
}
}
}


使用Action Settings.ACTION_MANAGE_WRITE_SETTINGS 启动隐式Intent
使用"package:" + getPackageName()携带App的包名信息
使用Settings.System.canWrite方法检测授权结果

附上github项目链接: 点击打开链接


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值