【问题标题】:Android multiple permission errorAndroid多权限错误
【发布时间】:2016-11-18 10:37:36
【问题描述】:

情况:点击camera(imageview)时会提示多个权限。

  1. 如果用户在第一个权限和第二个权限上选择“拒绝”,它就可以工作。
  2. 如果用户在第一个权限和第二个权限上选择 ALLOW,则它可以工作。
  3. 如果用户在第一个权限上选择 DENY,在第二个权限上选择 ALLOW,则可以正常工作。
  4. 如果用户在第 1 个权限上选择 ALLOW,在第 2 个权限上选择 DENY,则会出现错误。

这是代码(扩展片段):

private static String[] PERMISSIONS_CAMERA = {Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};


 img_1 = (ImageView) view.findViewById(R.id.img_1);
 img_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startCamera();
            }
        });    
        private void StartCamera() {
        requestPermissions(PERMISSIONS_CAMERA, REQUEST_CAMERA);
    }

   private void OpenCamera() {
        Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, REQUEST_CAMERA);
        this.bitmap = null;
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

     switch (requestCode) {
            // For camera
            case REQUEST_CAMERA:
                 if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    OpenCamera();
                } else {
                    Toast.makeText(getActivity(), "Go to settings and enable permissions", Toast.LENGTH_LONG).show();
                }
                break;
    }

}

错误日志:

  java.lang.RuntimeException: Failure delivering result
  ResultInfo{who=@android:requestPermissions:, request=131073,
  result=-1, data=Intent {
  act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to
  activity {app.swb.mont/app.swb.mont.ui.activity.MainActivity}:
  java.lang.SecurityException: Permission Denial: starting Intent {
  act=android.media.action.IMAGE_CAPTURE
  cmp=com.sec.android.app.camera/.Camera } from ProcessRecord{b2f7ceb
  28260:app.swb.mont/u0a392} (pid=28260, uid=10392) with revoked
  permission android.permission.CAMERA at    android.app.ActivityThread.deliverResults(ActivityThread.java:4925)
                   at android.app.ActivityThread.handleSendResult(ActivityThread.java:4968)
                   at android.app.ActivityThread.access$1600(ActivityThread.java:222)
                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1849)
                   at android.os.Handler.dispatchMessage(Handler.java:102)
                   at android.os.Looper.loop(Looper.java:158)
                   at android.app.ActivityThread.main(ActivityThread.java:7229)
                   at java.lang.reflect.Method.invoke(Native Method)
                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                Caused by: java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE
 cmp=com.sec.android.app.camera/.Camera } from ProcessRecord{b2f7ceb
 28260:app.swb.mont/u0a392} (pid=28260, uid=10392) with revoked
 permission android.permission.CAMERA

【问题讨论】:

  • 在你的 switch case grantResults.length > 0 true 但你没有给相机权限所以它抛出异常
  • 在调用 OpenCamera() 时专门检查相机权限

标签: android permissions camera


【解决方案1】:

问题是您没有正确处理 onRequestPermissionResult。 在这条线上

if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                OpenCamera();}

您只检查您请求的女巫在这种情况下Manifest.permission.READ_EXTERNAL_STORAGE(位置== 0)的第一个权限,并且您触发了您的相机功能女巫需要位置== 2的权限

解决方案

if (grantResults.length > 0 && grantResults[2] == PackageManager.PERMISSION_GRANTED) {
                OpenCamera();}

if (grantResults.length > 0 && (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED && grantResults[2] == PackageManager.PERMISSION_GRANTED) ) {
                OpenCamera();}

// 也可以使用循环

【讨论】:

  • 我明白了。如果只有1个权限怎么样。它仍然适用于超过 1 个数组吗?
  • 找到了解决方案!谢谢你们。
【解决方案2】:

那是因为您只检查第一个权限结果,而不检查第二个:grantResults[0] == PackageManager.PERMISSION_GRANTED。你需要检查 grantResults[1] == PackageManager.PERMISSION_GRANTED也一样

【讨论】:

    【解决方案3】:

    如果您的要求是如果所有权限都已授予,那么只有它必须工作,您可以尝试这样

    @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[]permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            switch (requestCode) {
                // For camera
                case REQUEST_CAMERA:
                    if (grantResults.length > 0) {
                        boolean permGiven = true;
                        for(int i=0; i<grantResults.length; i++){
                            if(grantResults[i] != PackageManager.PERMISSION_GRANTED)
                                permGiven = false;
                        }
                        if(permGiven)
                            OpenCamera();
                        else
                            Toast.makeText(MainActivity.this, "Go to settings and enable permissions", Toast.LENGTH_LONG).show();
                    } else {
                        Toast.makeText(MainActivity.this, "Go to settings and enable permissions", Toast.LENGTH_LONG).show();
                    }
                    break;
    
    
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 2014-12-04
      • 2011-05-31
      • 2015-12-23
      • 1970-01-01
      • 2018-09-08
      • 2019-08-10
      相关资源
      最近更新 更多