Android(安卓)需要动态申请的权限以及EasyPermission 的使用
追加:https://www.jianshu.com/p/c1219d1d2401
使用RXpermission申请动态权限更好用~~
Android6.0(API 23)以后,一些涉及敏感数据的权限申请需要动态申请了,不能直接在menifest添加就可以用了。
一、需要动态申请的权限
引用:http://blog.csdn.net/htwhtw123/article/details/76032997
所属权限组 | 权限 |
---|---|
日历 | READ_CALENDAR |
日历 | WRITE_CALENDAR |
相机 | CAMERA |
联系人 | READ_CONTACTS |
联系人 | WRITE_CONTACTS |
联系人 | GET_ACCOUNTS |
位置 | ACCESS_FINE_LOCATION |
位置 | ACCESS_COARSE_LOCATION |
麦克风 | RECORD_AUDIO |
电话 | READ_PHONE_STATE |
电话 | CALL_PHONE |
电话 | READ_CALL_LOG |
电话 | WRITE_CALL_LOG |
电话 | ADD_VOICEMAIL |
电话 | USE_SIP |
电话 | PROCESS_OUTGOING_CALLS |
传感器 | BODY_SENSORS |
短信 | SEND_SMS |
短信 | RECEIVE_SMS |
短信 | READ_SMS |
短信 | RECEIVE_WAP_PUSH |
短信 | RECEIVE_MMS |
存储 | READ_EXTERNAL_STORAGE |
存储 | WRITE_EXTERNAL_STORAGE |
二、不需要动态申请的权限
引用:https://blog.csdn.net/chen969097157/article/details/78047596
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 删除快捷方式
三、使用EasyPermission库进行权限动态申请
1、导入easypermission库:
compile 'pub.devrel:easypermissions:1.0.1'
2、动态申请权限
//所要申请的权限String[] permsLocation = {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION};if (EasyPermissions.hasPermissions(this, permsLocation )) { //已经获取所要申请的权限,进行下一步处理} else { //没有获取,申请定位权限 EasyPermissions.requestPermissions(this,"请求获得设备定位权限", 1, permsLocation); } }//Android 系统权限结果监听回调@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); //调用easypermission结果监听返回 EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);}//easypermission 权限结果监听回调@Overridepublic void onPermissionsGranted(int requestCode, List perms) { }@Overridepublic void onPermissionsDenied(int requestCode, List perms) {} //EasyPermissions.onRequestPermissionsResult 源码 /** * Handle the result of a permission request, should be called from the calling {@link * Activity}'s {@link ActivityCompat.OnRequestPermissionsResultCallback#onRequestPermissionsResult(int, * String[], int[])} method. * * If any permissions were granted or denied, the {@code object} will receive the appropriate * callbacks through {@link PermissionCallbacks} and methods annotated with {@link * AfterPermissionGranted} will be run if appropriate. * * @param requestCode requestCode argument to permission result callback. * @param permissions permissions argument to permission result callback. * @param grantResults grantResults argument to permission result callback. * @param receivers an array of objects that have a method annotated with {@link * AfterPermissionGranted} or implement {@link PermissionCallbacks}. */ public static void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults, @NonNull Object... receivers) { // Make a collection of granted and denied permissions from the request. List granted = new ArrayList<>(); List denied = new ArrayList<>(); for (int i = 0; i < permissions.length; i++) { String perm = permissions[i]; if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { granted.add(perm); } else { denied.add(perm); } } // iterate through all receivers for (Object object : receivers) { // Report granted permissions, if any. if (!granted.isEmpty()) { if (object instanceof PermissionCallbacks) { ((PermissionCallbacks) object).onPermissionsGranted(requestCode, granted); } } // Report denied permissions, if any. if (!denied.isEmpty()) { if (object instanceof PermissionCallbacks) { ((PermissionCallbacks) object).onPermissionsDenied(requestCode, denied); } } // If 100% successful, call annotated methods if (!granted.isEmpty() && denied.isEmpty()) { runAnnotatedMethods(object, requestCode); } } }
四、使用RxPermissions库:
RxPermissions git链接
五、自定义权限申请工具类
6.0以上动态申请权限工具类
更多相关文章
- Android文件存储--采用SharedPreferences保存用户偏好设置参数和
- Android(安卓)studio 安装 环境搭建
- Android解析HTML+android爬虫框架jsoup
- MPAndroidChart开源图表库(一)之饼状图
- ClipboardService(CBS)中的权限管理
- android APP字体大小,不随系统的字体大小变化而变化的方法
- Android(安卓)Permission 中文说明
- Android(安卓)Studio Checkout GitHub Error:cannot run program
- Android精通:TableLayout布局,GridLayout网格布局,FrameLayout帧布