安卓6.0动态申请权限

版权声明:没有申明版权,你们随意! https://blog.csdn.net/baby986911/article/details/78849573

现在安卓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
 
 
	@Override
	public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    	PermissionUtil.INSTRANSE.onRequestPermissionsResult(requestCode,permissions,grantResults,this);
	}
6 打完收工

猜你喜欢

转载自blog.csdn.net/baby986911/article/details/78849573