【问题标题】:Q: Android Dev - Permission Check/Req for Multiple Permissions - is this correct?问:Android 开发 - 多个权限的权限检查/请求 - 这是正确的吗?
【发布时间】:2016-10-04 16:34:18
【问题描述】:

大家好,感谢您协助我的问题..

我是第一次尝试在应用程序中实现新的权限请求,所以我只需要一点帮助..

基本上,我的第 1 步涉及检查权限是否已被授予,如果尚未授予,则在下一步中请求它。
但我需要检查并确保所有我需要的权限被授予,而不仅仅是一个..

这就是我检查一个权限的方法:

private void checkPermission() {

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {

        // Permission already available, continue to Method "finishPermissionCheck"
        finishPermissionCheck();

    } else {
        // Permission needs to be requested, continue to Method "requestPermission"
        requestPermission();
    }
}

好的,这仅适用于一个权限,但我需要检查 MULTIPLE 权限(如果需要,请求多个权限).. 我尝试使用 && 来包含其余的权限,但无济于事.. 我还尝试创建一个包含多个权限的字符串,如下所示..

这就是我的尝试的样子..

首先我在范围内创建一个包含多个权限的字符串(在这种情况下,我只是尝试 2 个权限):

private static final String[] requiredPermissions = {
        Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.RECEIVE_BOOT_COMPLETED
};

然后我将权限检查代码更改为如下所示:

private void checkPermission() {

    if (ActivityCompat.checkSelfPermission(this, String.valueOf(requiredPermissions))
            == PackageManager.PERMISSION_GRANTED) {

        // Permission already available, continue to Method "finishPermissionCheck"
        finishPermissionCheck();

    } else {
        // Permission needs to be requested, continue to Method "requestPermission"
        requestPermission();
    }
}

但是,我不确定这是否是正确的方法。

完成这项任务的最佳方法是什么?

..是的版主,我已经浏览了与该主题相关的其他帖子。

非常感谢您的帮助!

【问题讨论】:

    标签: java android android-studio permissions android-permissions


    【解决方案1】:

    您好,我最近遇到了同样的问题。我将分享我的实现。在我的情况下,我需要检查所有两个权限,但它看起来对我来说是可扩展的。

    MyPermissionHandler.java

    // return true if all permissions are granted
    public boolean getPermissions() {
        // if version is smaller, the permissions in the xml file are enough
        if(Build.VERSION.SDK_INT<Build.VERSION_CODES.M) {
            return true;
        }
    
        // create an array list with needed permissions if they are not granted already
        ArrayList<String> perms = new ArrayList<String>() {{
            if(!hasCameraPermission()) add(Manifest.permission.CAMERA);
            if(!hasWritePermission()) add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }};
    
        if(perms.size()>0) {
            ActivityCompat.requestPermissions(activity, perms.toArray(new String[0]), MainActivity.MY_PERMISSIONS_REQUEST_CAMERA);
            return false;
        } else {
            return true;
        }
    }
    
    private boolean hasCameraPermission() {
        return ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED;
    }
    private boolean hasWritePermission() {
        return ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
    }
    

    在 MainActivity.java 中

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    
        // if at least one permission is denied, finish the activity
        for(int permission : grantResults) {
            if(permission != PackageManager.PERMISSION_GRANTED) {
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("Error")
                        .setMessage("This application needs all permissions.")
                        .setCancelable(false)
                        .setNeutralButton("Ok", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                finish();
                            }
                        })
                        .show();
    
                return;
            }
        }
    
        // all permissions are granted
    }
    

    如果您需要添加更多权限,您只能更改MyPermissionHandler.java 文件中的代码。希望这可以帮助! :)

    顺便说一句,您可以在活动的 onResume() 方法中添加一些检查,以防用户最小化程序并进入设置以禁用例如相机权限。在他返回应用程序并且应用程序尝试打开相机后,应用程序将崩溃。所以你必须小心。

    【讨论】:

    • 很棒的答案!感谢您花时间为我创造如此致命的回应! :) 我还没有测试它,但是一旦我(很快)测试它,我一定会让它成为公认的答案,并感谢你付出了巨大的努力。我唯一担心的是:我需要一个允许我将“位置”设置关闭的权限。但我很确定这是一个无法更改的安全设置(“只读” )。但是,我正在研究 Google API,试图弄清楚我如何能够通过系统提示让用户确定它(无需用户进入设置屏幕)
    • 据我所知,您不能“切换”位置传感器的开/关。我曾经不得不启用“未知来源”设置,它可以让不是来自 Google Play 商店的应用程序安装其他应用程序(我需要这个,所以我可以进行自动更新)。但是我没有找到一种方法来通过提示或任何我可以要求的权限来做到这一点,所以我打开了设置菜单,该设置是为用户设置的,并“希望”他会找到正确的设置。如果您发现任何对位置传感器有帮助的东西,请随时分享。 :) @StudioB
    • 问题:使用 Google 的 SettingsAPI 怎么样?我认为可以请求更改设置,并弹出一个系统对话框来询问更改它的权限,类似于地图应用程序所做的事情。你知道吗? @Zdravko Donev
    【解决方案2】:

    在您的 finishPermissionCheck(); 方法中调用以下代码 ->

    ActivityCompat.requestPermissions(SendMoneyByDetailsActivity.this, requiredPermissions , REQUEST_CODE);
    

    【讨论】:

    • 我不确定你为什么建议我将你建议的那行代码(到 requestPermissions)添加到我的“finishPermissionCheck();”中方法,考虑到这是我在验证权限检查成功后调用的方法。如果我对您的建议遗漏了什么,请解释一下。否则我会假设存在沟通不畅。
    猜你喜欢
    • 2017-09-26
    • 1970-01-01
    • 2019-09-20
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多