如何在Android M中检查单个请求的多个权限?

Zal*_*inh 58 android android-6.0-marshmallow runtime-permissions

我想用

  1. android.permission.CAMERA
  2. android.permission.WRITE_EXTERNAL_STORAGE

在单个请求中使用

ActivityCompat.requestPermissions(Activity activity,new String permisionList[],int permissionRequestcode);
Run Code Online (Sandbox Code Playgroud)

但我的问题是,我只是请求一个权限,我读了关于组权限,但它只适用于由开发人员,喜欢CONTACT_GROUP : read_contact,write_contact等决定的相同组.

我想创建自定义组权限,只向我询问一个请求并仅向我提供一个响应.

谢谢

Unc*_*ion 70

您可以在单个请求中询问多个权限(来自不同的组).为此,您需要将所有权限添加到您提供的字符串数组作为requestPermissions API的第一个参数,如下所示:

requestPermissions(new String[]{
                                Manifest.permission.READ_CONTACTS,
                                Manifest.permission.ACCESS_FINE_LOCATION},
                        ASK_MULTIPLE_PERMISSION_REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)

执行此操作时,您将看到权限弹出窗口是多个权限弹出窗口的堆栈.当然,您需要处理每个权限的接受和拒绝(包括"永不再问")选项.同样经过精心解释了这里.

  • 请完整阅读我的问题..我想在单个请求中检查所有权限..不是多个对话框.你的链接与我的问题无关...对不起.. (7认同)
  • 不是答案.多个对话框是邪恶的. (4认同)
  • 我必须添加`this`,否则它不会工作`ActivityCompat.requestPermissions(this, new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE, ...} ,ASK_MULTIPLE_PERMISSION_REQUEST_CODE);` (2认同)

moh*_*hit 28

首先初始化权限请求代码

public  static final int PERMISSIONS_MULTIPLE_REQUEST = 123;
Run Code Online (Sandbox Code Playgroud)

检查android版本

 private void checkAndroidVersion() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        checkPermission();

    } else {
        // write your logic here
    }

}
Run Code Online (Sandbox Code Playgroud)

检查多个权限代码

 private void checkPermission() {
    if (ContextCompat.checkSelfPermission(getActivity(),
            Manifest.permission.READ_EXTERNAL_STORAGE) + ContextCompat
            .checkSelfPermission(getActivity(),
                    Manifest.permission.CAMERA)
            != PackageManager.PERMISSION_GRANTED) {

        if (ActivityCompat.shouldShowRequestPermissionRationale
                (getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) ||
                ActivityCompat.shouldShowRequestPermissionRationale
                        (getActivity(), Manifest.permission.CAMERA)) {

      Snackbar.make(getActivity().findViewById(android.R.id.content),
                    "Please Grant Permissions to upload profile photo",
                    Snackbar.LENGTH_INDEFINITE).setAction("ENABLE",
                    new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            requestPermissions(
                                    new String[]{Manifest.permission
                                            .READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA},
                                    PERMISSIONS_MULTIPLE_REQUEST);
                        }
                    }).show();
        } else {
            requestPermissions(
                    new String[]{Manifest.permission
                            .READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA},
                    PERMISSIONS_MULTIPLE_REQUEST);
        }
    } else {
        // write your logic code if permission already granted
    }
}
Run Code Online (Sandbox Code Playgroud)

用户授予权限后回调方法

@Override
public void onRequestPermissionsResult(int requestCode,
                                       @NonNull String[] permissions, @NonNull int[] grantResults) {

    switch (requestCode) {
        case PERMISSIONS_MULTIPLE_REQUEST:
            if (grantResults.length > 0) {
               boolean cameraPermission = grantResults[1] == PackageManager.PERMISSION_GRANTED;
               boolean readExternalFile = grantResults[0] == PackageManager.PERMISSION_GRANTED;

                if(cameraPermission && readExternalFile)
                {
                    // write your logic here 
                } else {
                    Snackbar.make(getActivity().findViewById(android.R.id.content),
                        "Please Grant Permissions to upload profile photo",
                        Snackbar.LENGTH_INDEFINITE).setAction("ENABLE",
                        new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                requestPermissions(
                                        new String[]{Manifest.permission
                                                .READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA},
                                        PERMISSIONS_MULTIPLE_REQUEST);
                            }
                        }).show();
                }
           }
           break;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 依靠幻数(PERMISSION_GRANTED = 0)非常粗略. (2认同)

Yve*_*omb 5

在这个阶段没有黑客可以规避来自不同组的权限.这就是android如何开发运行时权限的本质,让用户可以选择接受哪些权限.当然不接受应用程序所需的所有权限,可能会使应用程序无法正常工作.

CAMERA和WRITE_EXTERNAL_STORAGE都被视为危险权限,并且在单独的组中,因此都需要运行时权限请求.

一旦为特定组授予了权限,就不需要在应用程序运行的生命周期内再次请求它,或者如果作为默认设置提供它,则不再需要它.

在此输入图像描述

在此输入图像描述

你唯一能做的就是要求用户接受默认的决定,可以通过使用"再也不要问"来撤销这些决定.

在此输入图像描述


Isa*_*ahJ 5

我遇到了同样的问题,偶然发现了这个.

基本上,您可以按顺序请求多个权限,此外,如果用户拒绝您的许可,您可以添加侦听器以弹出快餐栏.

dexter_sample