首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android多权限错误

Android多权限错误
EN

Stack Overflow用户
提问于 2016-11-18 10:37:36
回答 3查看 157关注 0票数 0

情况:当相机(图像视图)被点击时,它将提示多个权限。

  1. 如果用户选择拒绝在第一和第二权限,它是有效的。
  2. 如果用户选择允许在第一和第二权限,它的工作。
  3. 如果用户选择拒绝在第一权限和允许在第二权限,它是有效的。
  4. 如果用户在第一个权限上选择“允许”,而在第二个权限上选择“拒绝”,则会出现错误。

下面是代码(扩展片段):

代码语言:javascript
复制
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;
    }

}

错误日志:

代码语言:javascript
复制
  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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-18 10:51:12

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

代码语言:javascript
复制
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                OpenCamera();}

您只检查您所请求的女巫在本例中是Manifest.permission.READ_EXTERNAL_STORAGE (位置== 0)的第一个权限,并且触发您的相机功能,它需要在位置== 2处获得许可。

解决方案

代码语言:javascript
复制
if (grantResults.length > 0 && grantResults[2] == PackageManager.PERMISSION_GRANTED) {
                OpenCamera();}

代码语言:javascript
复制
if (grantResults.length > 0 && (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED && grantResults[2] == PackageManager.PERMISSION_GRANTED) ) {
                OpenCamera();}

//还可以使用循环

票数 0
EN

Stack Overflow用户

发布于 2016-11-18 10:51:14

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

票数 0
EN

Stack Overflow用户

发布于 2016-11-18 11:01:14

如果您的要求是,如果所有的权限给定,那么只有它必须工作,您可以这样做

代码语言:javascript
复制
@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;


        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40674939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档