• android 权限动态申请


    名字其实有点让人感觉高大上"权限动态申请",其实也没有什么,

    以前做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,还是有个奇怪的问题,前面我都拒绝,然后就会提示进入  应用管理界面

    按理说默认应该是询问状态,,但是却是  显示的允许......然后发现必须自己重复点击一下拒绝,然后再点击一下允许

    回到界面后才会正常........按理来说用户不会像我似的,因为我一直在调试

    但是确实是一个问题.....

     但是还有个问题,那天让一个朋友测试,发现另一个问题,,如果在安装的时候就修改,不允许任何权限,,那么安装完以后,也不会进入

     所以最终决定,把这里屏蔽了

    因为现在还不能准确的判断

    以后判断呢只能是异常捕获了........

    假如说,用户没有同意摄像头权限,然后执行摄像头的一些程序的时候肯定会报错

    然后在异常捕获里提醒用户  跳转到应用权限管理里面去打开权限

  • 相关阅读:
    十三 .Django(ORM表高级操作)
    十二 .Django ForeighKey自关联(ORM)
    十二 .Django 一对多表ForeighKey(ORM)
    十一 .Django 一对一表OneToOneField (ORM)
    十 .Django 单表操作(ORM)
    八 .Django 模型(models)
    【模板】Lucas定理
    【模板】AC自动机加强版
    【模板】AC自动机
    【POJ3162】Walking Race 树形dp+单调队列+双指针
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/9304373.html
Copyright © 2020-2023  润新知