安卓6.0动态申请权限

来源:互联网 发布:女性职场穿着知乎 编辑:程序博客网 时间:2024/06/06 23:17

现在安卓6.0申请权限的开源代码也很多,但是不想项目里引用的东西太多,能不搬的就不搬了,自己写了一个申请权限的,在Gerymontion上测试,还能用,如果有需要改善的,请留言.

1 写一个接口

  

public interface PermissionListener {        //有权限或者申请的时候给了,就继续做下面的动作        void hasPermission() ;        //没有权限        void hasNoPermission() ;        //点了不再提示        void neverShowPermission();}
2 写一个申请的工具类
public enum PermissionUtil   {    INSTRANSE ;    private PermissionListener permissionListener ;    //请求权限    public void responsePermission(AppCompatActivity appCompatActivity ,PermissionListener permissionListener, String... permissionName) {        this.permissionListener = permissionListener;        if (Build.VERSION.SDK_INT >= 23) {        List<String> pList = new ArrayList<>();        for (String str : permissionName) {            pList.add(str);        }        String[] strings = pList.toArray(new String[pList.size()]);        boolean bb = checkPermissionAllGranted(appCompatActivity, strings);        if (!bb) {            //如果没有,请求            ActivityCompat.requestPermissions(appCompatActivity, strings, Constants.permissionStr.permissionResponse);        } else {            //有权限            permissionListener.hasPermission();        }    }else{            //小于23,没必要申请            permissionListener.hasPermission();        }    }    /**     * 检查APP是否拥有指定的所有权限     */    protected boolean checkPermissionAllGranted(Context mContext, String[] permissions) {        for (String permission : permissions) {            if (ContextCompat.checkSelfPermission(mContext, permission) != PackageManager.PERMISSION_GRANTED) {                // 只要有一个权限没有被授予, 则直接返回 false                return false;            }        }        return true;    }    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults,AbstractActivity activity){        if (requestCode == Constants.permissionStr.permissionResponse) {            if (PackageManager.PERMISSION_GRANTED == grantResults[0] ) {                //给了权限可以直接去操作                permissionListener.hasPermission();            } else {                if(neverShow(permissions, activity)){                    permissionListener.neverShowPermission();                }else{                    permissionListener.hasNoPermission();                }            }        }    }    //在用户已经拒绝授权的情况下,如果shouldShowRequestPermissionRationale返回false    // 可以推断出用户选择了不在提示选项,在这种情况下需要引导用户至设置页手动授权    private boolean neverShow(String permissions[], AbstractActivity activity){        boolean showagain ;        if (!ActivityCompat.shouldShowRequestPermissionRationale(activity, permissions[0])) {            showagain = true ;        }else{            showagain = false ;        }        return showagain ;    }}
3 假如用户点了不再提示,提示用户去设置(这个bug肯定是有的,自行解决,我们是特定的机型,所以不需要适配其他机型)
public enum DailogUtil {    INSTRANS;    public void getDailog(final AbstractActivity activity, final PermissionListener permissionListener) {        new AlertDialog.Builder(activity)                .setMessage("权限都不给我,你还想使用APP?去设置页面手动授权再来吧!!!!")                .setPositiveButton("去授权", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        //引导用户至设置页手动授权                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);                        //Constants.packageName  项目的包名,你可以写死                        Uri uri = Uri.fromParts("package", Constants.packageName, null);                        intent.setData(uri);                        activity.startActivity(intent);                    }                })                .setNegativeButton("取消", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        //引导用户手动授权,权限请求失败                        permissionListener.hasNoPermission();                    }                }).setOnCancelListener(new DialogInterface.OnCancelListener() {            @Override            public void onCancel(DialogInterface dialog) {                //引导用户手动授权,权限请求失败                permissionListener.hasNoPermission();            }        }).show();    }}
4 在申请的Activity里面去申请
   4.1 定义PermissionListener 
PermissionListener permissionListener ;
   4.2 初始化接口   
permissionListener= new PermissionListener() {    @Override    public void hasPermission() {        Log.e("MainActivity-->","申请成功");        // TODO: 2017/12/20    }    @Override    public void hasNoPermission() {        Log.e("MainActivity-->","申请失败");        // TODO: 2017/12/20    }    @Override    public void neverShowPermission() {        Log.e("MainActivity-->","点击了不再提示");        DailogUtil.INSTRANS.getDailog(MainActivity.this , permissionListener );    }};
5 点击调用 
 
case R.id.requestpermission:    /**     * Manifest.permission.WRITE_EXTERNAL_STORAGE;     * Manifest.permission.WRITE_SETTINGS;     * 定义成常量了     */    PermissionUtil.INSTRANSE.responsePermission(this, permissionListener, new String[]{            Constants.permissionStr.WRITE_EXTERNAL_STORAGE,Constants.permissionStr.Setting    });    break;
5 重写 onRequestPermissionsResult
@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {    PermissionUtil.INSTRANSE.onRequestPermissionsResult(requestCode,permissions,grantResults,this);}
6 打完收工