Android权限动态申请

  最近项目targetSDKVersion刚设置为大于22,所以权限这块需要动态去申请一下,因为看到网上很多例子都很全面,不同的情况都考虑到了,但是本身不需要那么多条件,所以打算自己写一个用,也可以满足大部分情况了。在此做一个记录,供自己以后查阅。代码片段可能不多,具体项目代码见GitHub地址
  Android API 23之后考虑到用户隐私及安全把权限分为普通权限跟危险,普通权限不需要申请,只需要在AndroidManifest.xml中申请就可以了,以下为普通权限及说明:

  • ACCESS_LOCATION_EXTRA_COMMANDS 定位权限
  • ACCESS_NETWORK_STATE 网络状态权限
  • ACCESS_NOTIFICATION_POLICY 通知 APP通知显示在状态栏
  • ACCESS_WIFI_STATE WiFi状态权限
  • BLUETOOTH 使用蓝牙权限
  • BLUETOOTH_ADMIN 控制蓝牙开关
  • BROADCAST_STICKY 粘性广播
  • CHANGE_NETWORK_STATE 改变网络状态
  • CHANGE_WIFI_MULTICAST_STATE 改变WiFi多播状态,应该是控制手机热点(猜测)
  • CHANGE_WIFI_STATE 控制WiFi开关,改变WiFi状态
  • DISABLE_KEYGUARD 改变键盘为不可用
  • EXPAND_STATUS_BAR 扩展bar的状态
  • GET_PACKAGE_SIZE 获取应用安装包大小
  • INTERNET 网络权限
  • KILL_BACKGROUND_PROCESSES 杀死后台进程
  • MODIFY_AUDIO_SETTINGS 改变音频输出设置
  • NFC 支付
  • READ_SYNC_SETTINGS 获取手机设置信息
  • READ_SYNC_STATS 数据统计
  • RECEIVE_BOOT_COMPLETED 监听启动广播
  • REORDER_TASKS 创建新栈
  • REQUEST_INSTALL_PACKAGES 安装应用程序
  • SET_TIME_ZONE 允许应用程序设置系统时间区域
  • SET_WALLPAPER 设置壁纸
  • SET_WALLPAPER_HINTS 设置壁纸上的提示信息,个性化语言
  • TRANSMIT_IR 红外发射
  • USE_FINGERPRINT 指纹识别
  • VIBRATE 震动
  • WAKE_LOCK 锁屏
  • WRITE_SYNC_SETTINGS 改变设置
  • SET_ALARM 设置警告提示
  • INSTALL_SHORTCUT 创建快捷方式
  • UNINSTALL_SHORTCUT 删除快捷方式

  而危险权限被分成了9个组别,并且需要动态去申请,每组只要申请一项就可以使用组内其他的权限了,不需要全部申请,以下是危险权限分组情况:
这里写图片描述

接下来就是申请权限了:

  1. 如果你的targetSDKVersion<23,那么什么权限都不用考虑了,只需要在AndroidManifest.xml中声明就可以了,但是如果你的项目中支持动态权限申请的话,不管普通权限还是危险权限都需要写在清单文件中,并且危险权限还需要在代码中去动态获取。
  2. 接下来就是权限申请部分了, 我把检查权限部分都写到工具类中了,使用的时候只需要在需要权限的地方申请就可以了,一下以申请相机权限为例:

请求:

LPermission.with(this)//Activity or Fragment
           .requestCode(100)//请求码
           .permission(Manifest.permission.CAMERA)//请求权限,多个以逗号隔开
           .showRationale(true)//可选,默认false,不显示Rationale
           .request();//请求

重写onRequestPermissionsResult:

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        LPermission.onPermissionResult(this, requestCode, permissions, grantResults);
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

成功:

@PermissionGranted(100)
public void success() {
    Toast.makeText(this, "成功操作", Toast.LENGTH_LONG).show();
}

失败:

@PermissionDenied(100)
public void failure() {
    Toast.makeText(this, "失败操作", Toast.LENGTH_LONG).show();
}

显示Rationale:

@PermissionRationale(100)
    void rationale() {
        Toast.makeText(this, "提示操作", Toast.LENGTH_LONG).show();
    }

不再提示操作:

@PermissionNeverAskAgain(100)
    void neverAskAgain() {
        Toast.makeText(this, "不再请求操作", Toast.LENGTH_LONG).show();
    }

完整github链接:https://github.com/liupengfei666/LPermission
注意:

  1. 所有的权限都必须要写到AndroidManifest.xml中
  2. .showRationale(boolean flag)是可选操作,如果用户不需要显示rationale则可以不设置或者设置为false(默认)
  3. 如果showRationale设置为true,当回调到@PermissionRationale(value = REUQEST)时,如果用户继续去请求权限,则showRationale必须设置为false

参考:
1、Everything every Android Developer must know about new Android’s Runtime Permission
2、PermissionGen
3、MPermissions
4、Android6.0动态申请权限那些坑–以及避免用户选择不再提示后无法获取权限的问题

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 应用中,有一些需要用户授权才能访问的敏感权限,比如读取联系人、摄像头、定位等权限。在 Android 6.0(API Level 23)及以上版本中,系统引入了动态权限申请机制,应用需要在运行时动态申请这些权限。 以下是 Android 动态申请权限的基本流程: 1. 在 AndroidManifest.xml 文件中声明需要申请权限,例如: ``` <uses-permission android:name="android.permission.CAMERA" /> ``` 2. 在应用中检查是否拥有该权限,如果没有则向用户申请权限。 ``` if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA); } ``` 3. 实现回调方法 onRequestPermissionsResult(),处理用户的权限选择结果。 ``` @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == MY_PERMISSIONS_REQUEST_CAMERA) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限已授予,执行相应操作 } else { // 权限被拒绝,提示用户并做相应处理 } return; } } ``` 以上就是 Android 动态申请权限的基本流程。需要注意的是,在申请权限前需要先检查是否已经授权,如果已经授权则可以直接执行相应操作,否则需要向用户申请权限。此外,在处理用户的权限选择结果时,需要根据 requestCode 参数进行判断,以确定是哪个权限申请结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值