android – 运行时的Marshmallow许可

这样一个新的和令人敬畏的安全功能是运行时权限

我试图理解它,并为一个演示,但一个问题提高了我的想法,当我处理用户权限与对话.

如何处理“再也不要问”

假设我的应用程序必须需要位置/联系,但用户DENY它“不要再询问”.

我能为此做些什么不是全部用户理解我的字段是必需的.

任何建议?

解决方法

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

你可以这样做.在这里,我检查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()方法.

您还可以处理用户检查时不会显示“运行时权限”对话框的情况,您可以显示Snackbar或按钮,将用户重定向到应用程序设置页面,因为用户已经选中“不要再次询问”后无法显示权限对话框.

@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,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"),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向用户显示有关权限的相关消息,mainLayout是Activity的主要版面的ID.

希望它可以帮助你.

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...