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 系统权限结果监听回调
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
     super.onRequestPermissionsResult(requestCode, permissions, grantResults);

     //调用easypermission结果监听返回
     EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}


//easypermission 权限结果监听回调
@Override
public void onPermissionsGranted(int requestCode, List perms) {       
}

@Override
public 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,安卓开发遇到问题总结)