如何在Android M中一次请求中检查多个权限?

69

我想在单个请求中使用以下权限:

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

请不要改变原意,保留HTML标记。

ActivityCompat.requestPermissions(Activity activity,new String permisionList[],int permissionRequestcode);

但是我的问题是有时我只请求一个权限,我了解到组权限,但它只适用于由开发人员决定的相同组,比如CONTACT_GROUP: read_contact,write_contact等。

我想创建自定义组权限,它只需要一个请求,并且只提供一个响应。

谢谢


3
抱歉,您不能这样做。每个群组都有自己的权限对话框,必须进行调用。 - Ragaisis
@Ragaisis 我想在一个请求中显示所有的权限,我知道如果我请求多个权限,但只得到一个结果。 - Zala Janaksinh
轻松请求多个权限的方法,请查看 https://github.com/sachinvarma/EasyPermission - Sachin Varma
16个回答

0

0

根据vedval的建议,我有了这个解决方案。

public boolean checkForPermission(final String[] permissions, final int permRequestCode) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        return true;
    }
    final List<String> permissionsNeeded = new ArrayList<>();
    for (int i = 0; i < permissions.length; i++) {
        final String perm = permissions[i];
        if (ContextCompat.checkSelfPermission(this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
            if (shouldShowRequestPermissionRationale(permissions[i])) {
                Snackbar.make(phrase, R.string.permission_location, Snackbar.LENGTH_INDEFINITE)
                        .setAction(android.R.string.ok, new View.OnClickListener() {
                            @Override
                            @TargetApi(Build.VERSION_CODES.M)
                            public void onClick(View v) {
                                permissionsNeeded.add(perm);
                            }
                        });
            } else {
                // add the request.
                permissionsNeeded.add(perm);
            }
        }
    }

    if (permissionsNeeded.size() > 0) {
        // go ahead and request permissions
        requestPermissions(permissionsNeeded.toArray(new String[permissionsNeeded.size()]), permRequestCode);
        return false;
    } else {
        // no permission need to be asked so all good...we have them all.
        return true;
    }
}

/**
 * Callback received when a permissions request has been completed.
 */
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    if (requestCode == REQUEST_READ_LOCATION) {
        int i = 0;
        for (String permission : permissions ){
            if ( permission.equals(Manifest.permission.ACCESS_FINE_LOCATION) && grantResults.length > 0 && grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                initLocationManager();
            }
            i++;
        }

    }
}

0
       // **For multiple permission you can use this code :**

       // **First:**
//Write down in onCreate method.

         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    requestPermissions(new String[]{
                                    android.Manifest.permission.READ_EXTERNAL_STORAGE,
                                    android.Manifest.permission.CAMERA},
                            MY_PERMISSIONS_REQUEST);

         }

        //**Second:**
    //Write down in a activity.
     @Override
        public void onRequestPermissionsResult(int requestCode,
                                               String permissions[], int[] grantResults) {
            switch (requestCode) {
                case MY_PERMISSIONS_REQUEST:

                    if (grantResults.length > 0
                            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        new Handler().postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                progressBar.setVisibility(View.GONE);
                                Intent i = new Intent(SplashActivity.this,
                                        HomeActivity.class);
                                startActivity(i);
                                finish();
                            }
                        }, SPLASH_DISPLAY_LENGTH);

                    } else {
                        finish();
                    }
                    return;
            }
        }

0

我来晚了,但我想告诉图书馆我已经结束了。

RxPermission 是最好的具有反应式代码的库,它使权限代码意外地只需一行。

RxPermissions rxPermissions = new RxPermissions(this);
rxPermissions
.request(Manifest.permission.CAMERA,
         Manifest.permission.READ_PHONE_STATE)
.subscribe(granted -> {
    if (granted) {
       // All requested permissions are granted
    } else {
       // At least one permission is denied
    }
});

在你的build.gradle中添加

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

dependencies {
    implementation 'com.github.tbruyelle:rxpermissions:0.10.1'
    implementation 'com.jakewharton.rxbinding2:rxbinding:2.1.1'
}

-1

你应该使用名为Dexter的依赖项,如下所示: https://github.com/Karumi/Dexter 通过这个,你可以轻松地获取一个或多个权限: 以下是给定的代码

    Dexter.withContext(this).
               withPermissions(Manifest.permission.CAMERA,
          Manifest.permission.WRITE_EXTERNAL_STORAGE)
               .withListener(new MultiplePermissionsListener() {
                  @Override
                    public void onPermissionsChecked(MultiplePermissionsReport 
                    multiplePermissionsReport) {
                    displaySong();
                  }

                @Override
                public void    onPermissionRationaleShouldBeShown(List<PermissionRequest> list,     
        PermissionToken permissionToken) {

                    permissionToken.continuePermissionRequest();

                }
            }).check();

-3

如果您想一次请求多个权限,可以使用以下方法link

compile 'com.kishan.askpermission:askpermission:1.0.3'

如果您在支持库中遇到冲突,请执行以下操作:
compile('com.kishan.askpermission:askpermission:1.0.3', {
    exclude group: 'com.android.support'
})

现在请求权限

new AskPermission.Builder(this)
    .setPermissions(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_EXTERNAL_STORAGE)
    .setCallback(/* PermissionCallback */)
    .setErrorCallback(/* ErrorCallback */)
    .request(/* Request Code */);

授权回调

  public void onPermissionsGranted(int requestCode) {
// your code  }

权限被拒绝的回调

 public void onPermissionsDenied(int requestCode) {
// your code} 

错误回调函数

public void onShowRationalDialog(PermissionInterface permissionInterface, int requestCode) {
// Alert user by Dialog or any other layout that you want.
// When user press OK you must need to call below method.
permissionInterface.onDialogShown();

}

public void onShowSettings(PermissionInterface permissionInterface, int requestCode) {
// Alert user by Dialog or any other layout that you want.
// When user press OK you must need to call below method.
// It will open setting screen.
permissionInterface.onSettingsShown();

}


不建议仅提供链接的答案。这可能会导致被踩,这只是一个警告,并最终会被删除。 - Ṃųỻịgǻňạcểơửṩ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接