android 自定义封装android 6.0以上动态权限添加工具类

android开发过程中,动态权限添加时避免不了的,我看过别的添加权限的好多文章,但大多数添加的过程太过臃肿,代码量大。很不合理,于是乎,自己封装了一个工具类。很简单,来上代码。

package com.example.zsh.sendmessagedemo;import android.app.Activity;import android.content.DialogInterface;import android.content.Intent;import android.content.pm.PackageManager;import android.net.Uri;import android.os.Build;import android.provider.Settings;import android.support.annotation.NonNull;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import android.support.v7.app.AlertDialog;import java.util.ArrayList;import java.util.List;public class PermissionTool {    private final int mRequestCode = 100;//权限请求码    public static boolean showSystemSetting = true;    private PermissionTool() {    }    private static PermissionTool permissionsUtils;    private IPermissionsResult mPermissionsResult;    public static PermissionTool getInstance() {        if (permissionsUtils == null) {            permissionsUtils = new PermissionTool();        }        return permissionsUtils;    }    public void chekPermissions(Activity context, String[] permissions, @NonNull IPermissionsResult permissionsResult) {        mPermissionsResult = permissionsResult;        if (Build.VERSION.SDK_INT < 23) {//6.0才用动态权限            permissionsResult.passPermissons();            return;        }        //创建一个mPermissionList,逐个判断哪些权限未授予,未授予的权限存储到mPerrrmissionList中        List mPermissionList = new ArrayList<>();        //逐个判断你要的权限是否已经通过        for (int i = 0; i < permissions.length; i++) {            if (ContextCompat.checkSelfPermission(context, permissions[i]) != PackageManager.PERMISSION_GRANTED) {                mPermissionList.add(permissions[i]);//添加还未授予的权限            }        }        //申请权限        if (mPermissionList.size() > 0) {//有权限没有通过,需要申请            ActivityCompat.requestPermissions(context, permissions, mRequestCode);        } else {            //说明权限都已经通过,可以做你想做的事情去            permissionsResult.passPermissons();            return;        }    }    //请求权限后回调的方法    //参数: requestCode  是我们自己定义的权限请求码    //参数: permissions  是我们请求的权限名称数组    //参数: grantResults 是我们在弹出页面后是否允许权限的标识数组,数组的长度对应的是权限名称数组的长度,数组的数据0表示允许权限,-1表示我们点击了禁止权限    public void onRequestPermissionsResult(Activity context, int requestCode, @NonNull String[] permissions,                                           @NonNull int[] grantResults) {        boolean hasPermissionDismiss = false;//有权限没有通过        if (mRequestCode == requestCode) {            for (int i = 0; i < grantResults.length; i++) {                if (grantResults[i] == -1) {                    hasPermissionDismiss = true;                }            }            //如果有权限没有被允许            if (hasPermissionDismiss) {                if (showSystemSetting) {                    showSystemPermissionsSettingDialog(context);//跳转到系统设置权限页面,或者直接关闭页面,不让他继续访问                } else {                    mPermissionsResult.forbitPermissons();                }            } else {                //全部权限通过,可以进行下一步操作。。。                mPermissionsResult.passPermissons();            }        }    }    /**     * 不再提示权限时的展示对话框     */    AlertDialog mPermissionDialog;    private void showSystemPermissionsSettingDialog(final Activity context) {        final String mPackName = context.getPackageName();        if (mPermissionDialog == null) {            mPermissionDialog = new AlertDialog.Builder(context)                    .setMessage("已禁用权限,请手动授予")                    .setPositiveButton("设置", new DialogInterface.OnClickListener() {                        @Override                        public void onClick(DialogInterface dialog, int which) {                            cancelPermissionDialog();                            Uri packageURI = Uri.parse("package:" + mPackName);                            Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);                            context.startActivity(intent);                            context.finish();                        }                    })                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {                        @Override                        public void onClick(DialogInterface dialog, int which) {                            //关闭页面或者做其他操作                            cancelPermissionDialog();                            //mContext.finish();                            mPermissionsResult.forbitPermissons();                        }                    })                    .create();        }        mPermissionDialog.show();    }    //关闭对话框    private void cancelPermissionDialog() {        if (mPermissionDialog != null) {            mPermissionDialog.cancel();            mPermissionDialog = null;        }    }    public interface IPermissionsResult {        void passPermissons();        void forbitPermissons();    }}

用的时候直接调用,如下:

//        把需要的权限添加到String[]数组中即可        PermissionTool.getInstance().chekPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,                Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA,                Manifest.permission.WRITE_CALENDAR, Manifest.permission.CALL_PHONE,                Manifest.permission.SEND_SMS,                Manifest.permission.RECORD_AUDIO}, new PermissionTool.IPermissionsResult() {            @Override            public void passPermissons() {//                通过权限的操作            }            @Override            public void forbitPermissons() {//                拒绝权限的操作            }        });    }

 

更多相关文章

  1. Android EasyPermissions官方库,高效处理权限
  2. Android小例子(点击一个按钮,传递数据给另一个页面)
  3. 转:Android中如何修改系统时间(应用程序获得系统权限)
  4. Android让页面默认弹出输入法的问题
  5. Android之——申请应用系统管理员权限
  6. android selinux权限, Permission denied, 访问限制
  7. [Android--Structure]App系统权限permission与安全security

随机推荐

  1. android中json解析的两个工具:Gson和Jacks
  2. android无线内网打印机打印出图片
  3. android uri的用法
  4. 推荐4款开源的Android引导页控件
  5. 漫谈android系统(1)解析android编译
  6. Arduino 制作蓝牙开关
  7. linux程序崩溃调试技术
  8. Android(安卓)漂亮的 Dialog (弹出框)
  9. Android支付Demo运行大坑
  10. Android(安卓)sdk更新过程中出现问题 (连