从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。此方法可以简化应用安装过程,因为用户在安装或更新应用时不需要授予权限。它还让用户可以对应用的功能进行更多控制;例如,用户可以选择为相机应用提供相机访问权限,而不提供设备位置的访问权限。用户可以随时进入应用的“Settings”屏幕调用权限。
首先我写了一个获取权限的接口然后可以继承接口可以对具体需要获取的权限进行重写
其实写这个主要是为了省点写代码的时间 有看过一个有趣的理论 面向对象编程的继承、封装、多态,其实都是为了一个目的:减少重复的代码量。写代码最忌讳的就是ctrl c ctrl v,当然我本人也无法彻底改变复制粘贴的习惯=-= 。下面进入主题
我先写了一个请求权限的接口:
public interface RequestPermission1 {
void requestPermission(Activity activity);
}
以请求写文件权限为例:
继承该借口并实现
/**
* Description:
* Data:2018/10/14-15:03
* Author: satsuki
*/
public class WriteExternalStorage implements RequestPermission1 {
@Override
public void requestPermission(Activity activity) {
//检查这个权限是否已经获取
int checkWriteExternalStoragePermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if(checkWriteExternalStoragePermission!= PackageManager.PERMISSION_GRANTED){
//如果没有权限则获取权限 requestCode在后面回调中会用到
ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},3);
Log.e("没有权限,","请求权限");
}
}
}
然后使用这个类就可以动态获取权限
其他权限可以参考https://developer.android.com/guide/topics/security/permissions?hl=zh-cn
进行相应的改写即可
最后可以复写它的回调函数 对是否获取到权限进行判断:
//此处的requestCode就是上面申请时自己定义的
@Override
public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {
switch (requestCode) {
case 3:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
} else {
Toast.makeText(this, "权限被拒绝了", Toast.LENGTH_LONG).show();
}
break;
default:
break;
}
}