名字其实有点让人感觉高大上"权限动态申请",其实也没有什么,
以前做Android程序的时候,比如需要打开摄像头
那么需要在
然后就可以了,
但是Android6.0之后呢,有些权限必须手动让用户同意才可以,哪些权限需要用户手动同意,哪些不需要这里大家自行百度
现在说一下
直接上程序吧
public void checkPermission() { int targetSdkVersion = 0; String[] PermissionString={Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; try { final PackageInfo info = this.getPackageManager().getPackageInfo(this.getPackageName(), 0); targetSdkVersion = info.applicationInfo.targetSdkVersion;//获取应用的Target版本 } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); // Log.e("err", "检查权限_err0"); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { //Build.VERSION.SDK_INT是获取当前手机版本 Build.VERSION_CODES.M为6.0系统 //如果系统>=6.0 if (targetSdkVersion >= Build.VERSION_CODES.M) { //第 1 步: 检查是否有相应的权限 boolean isAllGranted = checkPermissionAllGranted(PermissionString); if (isAllGranted) { //Log.e("err","所有权限已经授权!"); return; } // 一次请求多个权限, 如果其他有权限是已经授予的将会自动忽略掉 ActivityCompat.requestPermissions(this, PermissionString, 1); } } } /** * 检查是否拥有指定的所有权限 */ private boolean checkPermissionAllGranted(String[] permissions) { for (String permission : permissions) { if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { // 只要有一个权限没有被授予, 则直接返回 false //Log.e("err","权限"+permission+"没有授权"); return false; } } return true; } //申请权限结果返回处理 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1) { boolean isAllGranted = true; // 判断是否所有的权限都已经授予了 for (int grant : grantResults) { if (grant != PackageManager.PERMISSION_GRANTED) { isAllGranted = false; break; } } if (isAllGranted) { // 所有的权限都授予了 Log.e("err","权限都授权了"); } else { // 弹出对话框告诉用户需要权限的原因, 并引导用户去应用权限管理中手动打开权限按钮 //容易判断错 //MyDialog("提示", "某些权限未开启,请手动开启", 1) ; } } }
程序启动的时候检查权限
现在说一下流程
说一下,如果调用这个
就会执行
private void MyDialog(final String str1, final String str2, final int index) { android.support.v7.app.AlertDialog.Builder AlertDialogBuilder = new android.support.v7.app.AlertDialog.Builder(MainActivity.this, R.style.MyDialog); View mView = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog_config_button2, null); final TextView mTextView1 = mView.findViewById(R.id.tvdogcon1); final TextView mTextView2 = mView.findViewById(R.id.tvdogcon2); final Button mButton1 = mView.findViewById(R.id.btdogcon1); final Button mButton2 = mView.findViewById(R.id.btdogcon2); mButton2.setText("前去设置"); mButton2.setTextColor(Color.BLUE); mButton1.setText("取消"); mButton1.setTextColor(Color.BLACK); mTextView1.setText(str1); mTextView2.setText(str2); AlertDialogBuilder.setView(mView);//对话框加载视图 final android.support.v7.app.AlertDialog alertdialogbuilder = AlertDialogBuilder.create(); alertdialogbuilder.setCanceledOnTouchOutside(false);//点击外围不消失 alertdialogbuilder.show(); mButton1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { alertdialogbuilder.dismiss(); } }); mButton2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { alertdialogbuilder.dismiss(); Intent intent = new Intent(); intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); intent.setData(Uri.fromParts("package", getPackageName(), null)); startActivity(intent); } }); }
应用设置界面
然后就没了,
现在说一下BUG问题
大家百度
checkSelfPermission
总是返回 false 很多说这个问题的
这就导致一个问题,如果用户进入 应用设置界面 设置了允许对应的权限 然后回到程序,
结果...总是调用这个....这就太奇葩了
后来我发现,同时满足这两条条件再检测就不会了,可以准确的检查,
但是我重复安装了几次我的APP,还是有个奇怪的问题,前面我都拒绝,然后就会提示进入 应用管理界面
按理说默认应该是询问状态,,但是却是 显示的允许......然后发现必须自己重复点击一下拒绝,然后再点击一下允许
回到界面后才会正常........按理来说用户不会像我似的,因为我一直在调试
但是确实是一个问题.....
但是还有个问题,那天让一个朋友测试,发现另一个问题,,如果在安装的时候就修改,不允许任何权限,,那么安装完以后,也不会进入
所以最终决定,把这里屏蔽了
因为现在还不能准确的判断
以后判断呢只能是异常捕获了........
假如说,用户没有同意摄像头权限,然后执行摄像头的一些程序的时候肯定会报错
然后在异常捕获里提醒用户 跳转到应用权限管理里面去打开权限