棉花糖的运行时许可 [英] Run-time permission of Marshmallow

查看:83
本文介绍了棉花糖的运行时许可的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

运行时权限

我试图理解它并为此做一个演示,但是我想到一个问题,当我使用DIALOG处理用户权限时.

I am trying to understand it and make one demo for that But one question raise in my mind that when i am at handle user permission with DIALOG.

如何处理"不再询问"

假设我的应用程序必须需要位置/联系人,但用户使用永不询问"来拒绝它.

Suppose my application MUST need Location/contact but user DENY it with "NEVER ASK AGAIN".

我该怎么办.并非所有用户都了解我的字段是必填项.

What can i do for that. Not all User understand my field is required.

有任何建议吗?

推荐答案

首先,您需要在Activity中实现ActivityCompat类的OnRequestPermissionsResultCallback Listener,并覆盖void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)方法,以检查用户是否允许或拒绝许可

First you need to implement OnRequestPermissionsResultCallback Listener of ActivityCompat class in your Activity and override void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) Method to check whether User is allowing or denying the permission

您可以这样做.在这里,我检查WRITE_EXTERNAL_STORAGE的权限访问权限:

You can do like this. Here i check for permission access for WRITE_EXTERNAL_STORAGE:

int REQUEST_STORAGE = 1;

private void checkPermissions() {
    if (hasStoragePermissionGranted()) {
        // you can do whatever you want
    } else {
        requestPermission();
    }
}

public boolean hasPermissionGranted(){
        return  ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
}

public void requestPermission() {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
        ActivityCompat.requestPermissions(MainActivity.this, {Manifest.permission.WRITE_EXTERNAL_STORAGE},
                REQUEST_STORAGE);
    }
}

在此处,当用户从运行时权限"对话框中允许或拒绝权限时,将调用onRequestPermissionsResult()方法.

Here is onRequestPermissionsResult() method will be called when user allow or deny Permission from Runtime permission dialog.

您还可以处理用户已选中从不显示运行时权限"对话框的情况,可以显示Snackbar或按钮将用户重定向到您的应用程序设置页面,因为在用户选中"Never ask again"后无法显示权限对话框.

You can also handle situation when User has checked never show Runtime Permission dialog for that you can show Snackbar or button to redirect user to your application settings page as you can not show permission dialog after user has checked "Never ask again".

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

        if (requestCode == REQUEST_STORAGE) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
               //Storage permission is enabled
               canSendAttachments = true;
               systemLogsCheckbox.setEnabled(true);
            } else if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivtity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                //User has deny from permission dialog
                Snackbar.make(mainLayout, getResources().getString("Please enable storage permission"),
                        Snackbar.LENGTH_INDEFINITE)
                        .setAction("OK", new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
                                ActivityCompat.requestPermissions(MainActivity.this, {Manifest.permission.WRITE_EXTERNAL_STORAGE},
                REQUEST_STORAGE);
                            }
                        })
                        .show();
            } else {
                // User has deny permission and checked never show permission dialog so you can redirect to Application settings page
                Snackbar.make(mainLayout, getResources().getString("Please enable permission from settings"),
                        Snackbar.LENGTH_INDEFINITE)
                        .setAction("OK", new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
                                Intent intent = new Intent();
                                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                Uri uri = Uri.fromParts("package", MainActivity.this.getPackageName(), null);
                                intent.setData(uri);
                                startActivity(intent);
                            }
                        })
                        .show();
            }
        }
    }

在这里,我已经使用Snackbar向用户显示有关权限的相关消息,并且mainLayoutActivity's Main Layout的ID.

Here i have used Snackbar to show relevant message to user about Permission and mainLayout is id of Activity's Main Layout.

希望它对您有帮助.

这篇关于棉花糖的运行时许可的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆