一 。直接上代码 daima 里面 也有注释
1 先写一个我们需要的工具类
public class PermissionUtil {
//检查权限时,判断系统的权限集合
public static boolean permissionSet(Context context,String… permissions) {
for (String permission : permissions) {
if (isLackPermission(context,permission)) {//是否添加完全部权限集合
return true;
}
}
return false;
}
//检查系统权限是,判断当前是否缺少权限(PERMISSION_DENIED:权限是否足够)
private static boolean isLackPermission(Context context,String permission) {
return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_DENIED;
}
}
2 .写我们的BaseActivity
public abstract class BaseActivity extends AppCompatActivity{
//首先声明权限授权
public static final int PERMISSION_DENIEG = 1;//权限不足,权限被拒绝的时候
public int PERMISSION_REQUEST_CODE = 2;//系统授权管理页面时的结果参数
public static final String PACKAGE_URL_SCHEME = “package:”;//权限方案
// public CheckPermission checkPermission;//检测权限类的权限检测器
private boolean isrequestCheck = true;//判断是否需要系统权限检测。防止和系统提示框重叠
private AlertDialog.Builder builder;
private AlertDialog buidleDia;
public void setPERMISSION_REQUEST_CODE(int code){
this.PERMISSION_REQUEST_CODE=code;
}
//显示对话框提示用户缺少权限
public void showMissingPermissionDialog() {
if (builder==null) {
builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.help);//提示帮助
builder.setMessage(R.string.string_help_text);
//如果是拒绝授权,则退出应用
//退出
builder.setNegativeButton(R.string.quit, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
finish();
}
});
//打开设置,让用户选择打开权限
builder.setPositiveButton(R.string.settings, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
startAppSettings();//打开设置
}
});
builder.setCancelable(false);
}
//用来防止多次显示我们的窗口
if (buidleDia!=null) {
buidleDia.dismiss();
}
buidleDia = builder.show();
}
//获取全部权限
public boolean hasAllPermissionGranted(int[] grantResults) {
for (int grantResult : grantResults) {
if (grantResult == PackageManager.PERMISSION_DENIED) {
return false;
}
}
return true;
}
//打开系统应用设置(ACTION_APPLICATION_DETAILS_SETTINGS:系统设置权限)
public void startAppSettings() {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse(PACKAGE_URL_SCHEME + getPackageName()));
startActivity(intent);
}
//请求权限去兼容版本
public void requestPermissions(String... permission) {
ActivityCompat.requestPermissions(this, permission, PERMISSION_REQUEST_CODE);
}
/* *////
* 用于权限管理
* 如果全部授权的话,则直接通过进入
* 如果权限拒绝,缺失权限时,则使用dialog提示
*
*/////
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (PERMISSION_REQUEST_CODE == requestCode && hasAllPermissionGranted(grantResults)) //判断请求码与请求结果是否一致
{
isrequestCheck = true;//需要检测权限,直接进入,否则提示对话框进行设置
getAllGrantedPermission();
} else if (PERMISSION_REQUEST_CODE == requestCode){
//提示对话框设置
isrequestCheck = false;
showMissingPermissionDialog();//dialog
notGetAllGrantedPermission();
}
}
/* ////没有获取到权限调用的*/
public void notGetAllGrantedPermission() {
}
/* //*//*
* 当获取到所需权限后,进行相关业务操作
*/////
public void getAllGrantedPermission() {
}
protected void process(Bundle savedInstanceState) {
if (getPermissions() != null) {
if (PermissionUtil.permissionSet(this,getPermissions())) {
requestPermissions(getPermissions()); //去请求权限
} else {
getAllGrantedPermission();
}
}
}
/*用于在外部的请求权限用的*/
public void process1() {
if (getPermissions() != null) {
if (PermissionUtil.permissionSet(this,getPermissions())) {
requestPermissions(getPermissions()); //去请求权限
} else {
getAllGrantedPermission();
}
}
}
/* ////有需要就重写 没有就不必要了*/
public String[] getPermissions() {
return null;
}
@Override
protected void onResume() {
super.onResume();
/* //*//* //根据activity生命周期,onRestart()->onResume()*/
//此处表示从系统设置页面返回后,检查用户是否将所需的权限打开
if (!isrequestCheck) {
if (getPermissions() != null) {
if (PermissionUtil.permissionSet(this,getPermissions())) {
showMissingPermissionDialog();//dialog
} else {
//获取全部权限,走正常业务
getAllGrantedPermission();
}
}
} else {
isrequestCheck = true;
}
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//开启沉浸式状态栏
if (isOpenStatus()) {
Window window = getWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);//设置主窗体全屏
window.setStatusBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
setContentView(getContentId());
/* ButterKnife.bind(this);*/
loadData();
initView();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
process(savedInstanceState);
}
bindListener();
}
protected void loadData() {
}
protected void bindListener() {
}
protected void initView() {
}
}
二 。一般的在Activity里面的应用 ,直接重写父类的一些方法 就好了 其中有 个process1() 方法用于在你不想一开始在OnCreate里面 就申请权限用的 一开始 在 getPermission里面直接返null就可以 在需要申请的时候直接 返回需要的申请的权限就可以了 然后 调用上面的process1()的方法就好了。
三。 在其他类里面调用 可以直接 通过接口来回调 就可以 直接在Actiity里面 直接通过setListener方式来 就可以 (这里我一开始在Fragment里面 申请权限 我刚开始傻乎乎的还在BaseFragment里面也写了一套这个 醉了 当时感冒吃了感冒药 晕头了 )。