最近项目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个组别,并且需要动态去申请,每组只要申请一项就可以使用组内其他的权限了,不需要全部申请,以下是危险权限分组情况:
接下来就是申请权限了:
- 如果你的targetSDKVersion<23,那么什么权限都不用考虑了,只需要在AndroidManifest.xml中声明就可以了,但是如果你的项目中支持动态权限申请的话,不管普通权限还是危险权限都需要写在清单文件中,并且危险权限还需要在代码中去动态获取。
- 接下来就是权限申请部分了, 我把检查权限部分都写到工具类中了,使用的时候只需要在需要权限的地方申请就可以了,一下以申请相机权限为例:
请求:
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
注意:
- 所有的权限都必须要写到AndroidManifest.xml中
- .showRationale(boolean flag)是可选操作,如果用户不需要显示rationale则可以不设置或者设置为false(默认)
- 如果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动态申请权限那些坑–以及避免用户选择不再提示后无法获取权限的问题