举例:拨打号码
1.Anroid6.0运行时权限处理
findViewById(R.id.btn_callPhone).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//1.1首先判断有没有这个权限
//context 检查权限的字符串
int isPermission = ContextCompat.checkSelfPermission
(MainActivity.this, Manifest.permission.CALL_PHONE);
//返回值有两个,PERMISSION_GRANTED授予 PERMISSION_DENIED拒绝
if (isPermission == PackageManager.PERMISSION_GRANTED) {
//1.2如果有这个权限直接拨打号码
callPhone();
} else {
//如果没有就去申请权限
ActivityCompat.requestPermissions(MainActivity.this
,new String[]{Manifest.permission.CALL_PHONE},CALL_PHONE_REQUEST_CODE);
//requestPermissions(new String[]{Manifest.permission.CALL_PHONE},CALL_PHONE_REQUEST_CODE);
}
}
});
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode==CALL_PHONE_REQUEST_CODE){
if(grantResults.length>0&&grantResults!=null){
if(grantResults[0]==PackageManager.PERMISSION_GRANTED){
//授予了
callPhone();
}else{
Toast.makeText(this, "您的权限没有开启", Toast.LENGTH_SHORT).show();
}
}
}
}
private void callPhone() {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + 10086));
startActivity(intent);
}
2.搭建一套自己的权限处理框架:反射+注解的方法
权限成功后的注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PermissionSucceed {
public int requestCode();
}
权限帮助类:PermissionHelper
public class PermissionHelper {
//1.传什么参数
//1.1 Object Fragment,Activity 1.2 int 请求码 1.3 需要请求的权限 String[]
private Object mObject;
private int mRequestCode;
private String[] mPermission;
private PermissionHelper(Object object) {
this.mObject = object;
}
//2.以什么方式传入参数
//2.1直接传入参数的方式
public static void requestPermission(Activity activity, int requestCode, String[] permission) {
PermissionHelper.with(activity).requestCode(requestCode).requestPermission(permission)
.request();
}
//2.2链式调用
/**
* Activity
*/
public static PermissionHelper with(Activity activity) {
return new PermissionHelper(activity);
}
/**
* Fragment
*/
public static PermissionHelper with(Fragment fragment) {
return new PermissionHelper(fragment);
}
/**
* 添加一个注册码
*/
public PermissionHelper requestCode(int requestCode) {
this.mRequestCode = requestCode;
return this;
}
/**
* 添加权限
*/
public PermissionHelper requestPermission(String[] permission) {
this.mPermission = permission;
return this;
}
/**
* 3.1真正判断和发起权限
*/
public void request() {
// 3.2首先判断当期版本是不是6.0以上
if (!PermissionUtils.isOverMarshmallow()) {
//3.3如果不是6.0以上,那么直接执行方法 反射获取执行方法
//执行什么方法并不确定,只能采用注解的方式给方法打一个标记
//然后通过反射去执行 注解+反射
PermissionUtils.exectuteSucceedMethod(mObject, mRequestCode);
return;
}
//3.3.1如果授予了,那么我们直接执行这个方法 反射获取执行方法
List<String> deniedPermission = PermissionUtils.getDeniedPermission(mObject, mPermission);
if (deniedPermission.size() == 0) {
//代表全部已经被授予
PermissionUtils.exectuteSucceedMethod(mObject, mRequestCode);
} else {
//3.3.2如果没有被授予,那么我们就申请权限
ActivityCompat.requestPermissions(PermissionUtils.getActivity(mObject)
, deniedPermission.toArray(new String[deniedPermission.size()])
, mRequestCode);
}
}
/**
* 请求回掉处理
*/
public static void requestPermissionResult(Object object
, int requestCode, String[] permissions) {
List<String> deniedPermission = PermissionUtils.getDeniedPermission(object, permissions);
if (deniedPermission.size() == 0) {
//全部已经被授予
PermissionUtils.exectuteSucceedMethod(object, requestCode);
}else {
//你申请的权限中,有用户不同意的
PermissionUtils.exectuteFailMethod(object,requestCode);
}
}
}
权限工具类
public class PermissionUtils {
private PermissionUtils() {
throw new UnsupportedOperationException("cannot be instantiated");
}
/**
* 判断是不是6.0以上的版本
* Marshmallow棉花糖 6.0
*/
public static boolean isOverMarshmallow() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
}
/**
* 用户执行成功的方法
*/
public static void exectuteSucceedMethod(Object reflectObjcet, int requestCode) {
//获取class中所有的方法
Method[] methods = reflectObjcet.getClass().getDeclaredMethods();
//遍历我们打了标记的方法
for (Method method : methods) {
PermissionSucceed succeedMethod = method.getAnnotation(PermissionSucceed.class);
if (succeedMethod != null) {
int methodCode = succeedMethod.requestCode();
//并且我们的请求码必须requestCode一样
if (methodCode == requestCode) {
//反射执行该方法
exectuteMethod(reflectObjcet, method);
}
}
}
}
/**
* 反射执行该方法
*/
private static void exectuteMethod(Object reflectObjcet, Method method) {
try {
//第一个参数传该方法属于哪个类,第二个参数是传参数
method.setAccessible(true);
method.invoke(reflectObjcet, new Object[]{});
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
/**
* 获取没有授予过的权限
*/
public static List<String> getDeniedPermission(Object object, String[] permission) {
List<String> deniedPermissions = new ArrayList<>();
for (String requestPermission : permission) {
//把没有授予过的权限添加到集合中
if(ContextCompat.checkSelfPermission(getActivity(object), requestPermission)
==PackageManager.PERMISSION_DENIED){
deniedPermissions.add(requestPermission);
}
}
return deniedPermissions;
}
public static Activity getActivity(Object object) {
if (object instanceof Activity) {
return (Activity) object;
}
if (object instanceof Fragment) {
return ((Fragment) object).getActivity();
}
return null;
}
/**
* 用户执行失败的方法
*/
public static void exectuteFailMethod(Object object, int requestCode) {
//获取class中所有的方法
Method[] methods = object.getClass().getDeclaredMethods();
//遍历我们打了标记的方法
for (Method method : methods) {
PermissionFail failMethod = method.getAnnotation(PermissionFail.class);
if (failMethod != null) {
int methodCode = failMethod.requestCode();
//并且我们的请求码必须requestCode一样
if (methodCode == requestCode) {
//反射执行该失败方法
exectuteMethod(object, method);
}
}
}
}
}
请求失败注解类
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PermissionFail {
public int requestCode();
}
使用
public class MainActivity extends AppCompatActivity {
private static final int CALL_PHONE_REQUEST_CODE = 0X0011;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_callPhone).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/* //1.1首先判断有没有这个权限
//context 检查权限的字符串
int isPermission = ContextCompat.checkSelfPermission
(MainActivity.this, Manifest.permission.CALL_PHONE);
//返回值有两个,PERMISSION_GRANTED授予 PERMISSION_DENIED拒绝
if (isPermission == PackageManager.PERMISSION_GRANTED) {
//1.2如果有这个权限直接拨打号码
callPhone();
} else {
//如果没有就去申请权限
ActivityCompat.requestPermissions(MainActivity.this
, new String[]{Manifest.permission.CALL_PHONE}, CALL_PHONE_REQUEST_CODE);
//requestPermissions(new String[]{Manifest.permission.CALL_PHONE},CALL_PHONE_REQUEST_CODE);
}*/
PermissionHelper.with(MainActivity.this).requestCode(CALL_PHONE_REQUEST_CODE)
.requestPermission(new String[]{Manifest.permission.CALL_PHONE})
.request();
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
/*if (requestCode == CALL_PHONE_REQUEST_CODE) {
if (grantResults.length > 0 && grantResults != null) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//授予了
callPhone();
} else {
Toast.makeText(this, "您的权限没有开启", Toast.LENGTH_SHORT).show();
}
}
}*/
PermissionHelper.requestPermissionResult(this, requestCode, permissions);
}
@PermissionSucceed(requestCode = CALL_PHONE_REQUEST_CODE)
private void callPhone() {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + 10086));
startActivity(intent);
}
@PermissionFail(requestCode = CALL_PHONE_REQUEST_CODE)
private void callPhoneFail() {
Toast.makeText(this, "您的权限没有开启", Toast.LENGTH_SHORT).show();
}
}