关闭

Android权限动态申请

标签: android安全pemission
95人阅读 评论(0) 收藏 举报
分类:

  最近项目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动态申请权限那些坑–以及避免用户选择不再提示后无法获取权限的问题

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:9266次
    • 积分:279
    • 等级:
    • 排名:千里之外
    • 原创:18篇
    • 转载:5篇
    • 译文:0篇
    • 评论:7条
    文章分类
    最新评论