android6.0以上(API>=23),或者说Build.VERSION.SDK_INT >=Build.VERSION_CODES.M,敏感权限类似相机,位置,手机通讯录,打电话等权限都需要动态申请,先附上流程图,仅供参考,可以根据此流程进行自定义的二次封装扩展:
动态申请权限的流程图:
动态权限的工具类
package com.refly.pigcommissioner.permissionutil;
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
/**
*
* @author ytf
* @date 2018/4/25
*/
public class PermissionUtils {
private Activity context;
public static final int MY_PERMISSIONS_REQUEST_CALL_PHONE = 200;
private static PermissionUtils instance = null;
private PermissionUtils(Activity context) {
this.context = context;
}
/**
* 单例对象实例
*/
public static PermissionUtils getInstance(Activity context) {
if (instance == null) {
instance = new PermissionUtils(context);
}
return instance;
}
/**
* 是否需要动态申请权限
*
* @param requestCode
*/
public boolean needPermission(int requestCode) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return false;
}else {
return true;
}
// requestAllPermissions(requestCode);
}
/**
* 常用全部敏感权限
* @param requestCode
*/
public void requestAllPermissions(int requestCode) {
ActivityCompat.requestPermissions(context,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA, Manifest.permission.READ_PHONE_STATE, Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSIONS_REQUEST_CALL_PHONE);
}
/**
* 打电话 的权限
* @param requestCode
*/
public boolean requesCallPhonePermissions(int requestCode) {
if (ContextCompat.checkSelfPermission(context,
Manifest.permission.CALL_PHONE)
!= PackageManager.PERMISSION_GRANTED) {//没有权限
ActivityCompat.requestPermissions(context,
new String[]{Manifest.permission.CALL_PHONE},
MY_PERMISSIONS_REQUEST_CALL_PHONE);
return false;
} else {
return true;
}
}
/**
* 读取内存卡的权限
* @param requestCode
*/
public boolean requestReadSDCardPermissions(int requestCode) {
if (ContextCompat.checkSelfPermission(context,
Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {//没有权限
ActivityCompat.requestPermissions(context,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST_CALL_PHONE);
return false;
} else {
return true;
}
}
/**
* 获取相机权限
* @param requestCode
*/
public boolean requestCamerPermissions(int requestCode) {
if (ContextCompat.checkSelfPermission(context,
Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {//没有权限
ActivityCompat.requestPermissions(context,
new String[]{Manifest.permission.CAMERA},
MY_PERMISSIONS_REQUEST_CALL_PHONE);
return false;
} else {
return true;
}
}
/**
* 获取手机联系人的权限
* @param requestCode
*/
public boolean requestReadConstantPermissions(int requestCode) {
if (ContextCompat.checkSelfPermission(context,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {//没有权限
ActivityCompat.requestPermissions(context,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_CALL_PHONE);
return false;
} else {
return true;
}
}
/**
* 获取用户权限
* @param requestCode
*/
public boolean requestGET_ACCOUNTSPermissions(int requestCode) {
if (ContextCompat.checkSelfPermission(context,
Manifest.permission.GET_ACCOUNTS)
!= PackageManager.PERMISSION_GRANTED) {//没有权限
ActivityCompat.requestPermissions(context,
new String[]{Manifest.permission.GET_ACCOUNTS},
MY_PERMISSIONS_REQUEST_CALL_PHONE);
return false;
} else {
return true;
}
}
/**
* 获取定位权限
* @param requestCode
*/
public boolean requestLocationPermissions(int requestCode) {
if (ContextCompat.checkSelfPermission(context,
Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {//没有权限
ActivityCompat.requestPermissions(context,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSIONS_REQUEST_CALL_PHONE);
return false;
} else {
return true;
}
}
}
工具类使用的核心代码:
private com.refly.pigcommissioner.permissionutil.PermissionUtils instance = null;
@AfterViews
void afterViews() {
。。。
//判断是否为android6.0系统版本,如果是,需要动态添加权限
instance=com.refly.pigcommissioner.permissionutil.PermissionUtils.getInstance(this);
if (instance.needPermission(com.refly.pigcommissioner.permissionutil.PermissionUtils.MY_PERMISSIONS_REQUEST_CALL_PHONE)){
// 返回true表示需要动态申请权限
instance.requestLocationPermissions(200);
}else {
// 返回false不需要动态申请,直接操作
}
。。。。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
// requestCode即所声明的权限获取码,在checkSelfPermission时传入
case BAIDU_READ_PHONE_STATE:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 获取到权限,作相应处理(调用定位SDK应当确保相关权限均被授权,否则可能引起定位失败)
locationService = ((MainApp) getApplication()).locationService;
locationService.registerListener(myListener);
locationService.start();
} else {
// 没有获取到权限,做特殊处理
Toast.makeText(getApplicationContext(), "获取位置权限失败,请手动开启", Toast.LENGTH_SHORT).show();
}
break;
default:
Logger.e("获取位置权限失败,请手动开启");
break;
}
}