【问题标题】:My program only requests 1 permission at a time我的程序一次只请求 1 个权限
【发布时间】:2018-02-07 20:06:26
【问题描述】:

此程序需要访问相机和位置。但是,当设备需要同时请求两者时,它只请求其中一个权限,并且在我关闭我的程序然后重新打开它之前不会请求另一个。我无法弄清楚这个问题。

protected void requestBoth() {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CAMERA}, MULT_KEY);
    }

    protected void requestLoc() {
           ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCPERMISSION_KEY);
    }

    protected void requestCam() {
  ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMPERMISSION_KEY);
    }

public void request() {
    if ((ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) && (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED)) {
        requestUpdates();
    } else if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
        requestCam();
    } else if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
        requestLoc();
    } else {
        requestBoth();
    }

 }
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (Build.VERSION.SDK_INT >= 23) {
            request();
        }

    }

请有人帮忙!顺便说一句,我故意在这个问题中省略了 shouldShowRequestPermissionsRationale 以及 onRequestPermissionsResult 方法,因为我认为这些与问题无关。 (我什至尝试将 request() 调用放在 onResume() 中,但是当权限被拒绝并且用户选中“不再显示”时,这会导致无限循环。我完全没有想法。

【问题讨论】:

  • 找不到此代码的任何问题,您可能需要在其他部分查找问题。您是否从片段的活动中调用它?如果是后者,那么您可能对 FragmentManager 有问题
  • 请显示用户处理权限请求后执行的回调代码。

标签: android android-studio permissions


【解决方案1】:

另一个有效的解决方案是使用 RxJava 和RxPermission

所以你可以这样做:

rxPermissions
    .requestEach(Manifest.permission.CAMERA,
             Manifest.permission.ACCESS_FINE_LOCATION)
    .subscribe(permission -> { // will emit 2 Permission objects
        if (permission.granted) {
           // `permission.name` is granted !
        } else if (permission.shouldShowRequestPermissionRationale) {
           // Denied permission without ask never again
        } else {
           // Denied permission with ask never again
           // Need to go to the settings
        }
    });

或者您可以请求组合的每个权限:

rxPermissions
    .requestEachCombined(Manifest.permission.CAMERA,
             Manifest.permission.ACCESS_FINE_LOCATION)
    .subscribe(permission -> { // will emit 1 Permission object
        if (permission.granted) {
           // All permissions are granted !
        } else if (permission.shouldShowRequestPermissionRationale)
           // At least one denied permission without ask never again
        } else {
           // At least one denied permission with ask never again
           // Need to go to the settings
        }
    });

【讨论】:

    【解决方案2】:

    使用 Ted 权限:

    dependencies {
        compile 'gun0912.ted:tedpermission:2.1.0'
    }
    

    制作权限监听器

    PermissionListener permissionlistener = new PermissionListener() {
        @Override
        public void onPermissionGranted() {
            Toast.makeText(MainActivity.this, "Permission Granted", Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onPermissionDenied(ArrayList<String> deniedPermissions) {
            Toast.makeText(MainActivity.this, "Permission Denied\n" + deniedPermissions.toString(), Toast.LENGTH_SHORT).show();
        }
    
    
    };
    

    启动 TedPermission

    //Change your permission in this section, you can add any number of permissions\\
    // You can also check whether user has given the permission or not \\
    
    TedPermission.with(this)
        .setPermissionListener(permissionlistener)
        .setDeniedMessage("If you reject permission,you can not use this service\n\nPlease turn on permissions at [Setting] > [Permission]")
        .setPermissions(Manifest.permission.READ_CONTACTS, Manifest.permission.ACCESS_FINE_LOCATION)
        .check();
    

    欲了解更多信息,请访问

    https://github.com/ParkSangGwon/TedPermission

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      请求两个权限的方法必须是requestBoth():

      protected void requestBoth() {
              ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CAMERA}, MULT_KEY);
          }
      

      将您的代码更改为:

       if ((ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) && (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED)) {
               //requestUpdates();
                requestBoth();
      
          } 
          ...
      

      【讨论】:

      • 他的那段代码已经验证了这两个权限都被授予了,根本不需要请求任何权限。
      【解决方案4】:

      现在,您可以像这样将它们全部放在一个字符串数组中

       ActivityCompat.requestPermissions((Activity) Login.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_NUMBERS, Manifest.permission.READ_SMS}, 100);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-21
        • 2016-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-22
        相关资源
        最近更新 更多