【问题标题】:Android runntime permission is always denied without user interaction在没有用户交互的情况下,Android 运行时权限总是被拒绝
【发布时间】:2021-01-07 10:57:09
【问题描述】:

当我请求权限时(在本例中为 Manifest.permission.ACCESS_FINE_LOCATION"android.permission.ACCESS_FINE_LOCATION"),没有显示任何对话框并且权限总是被拒绝。当我检查 ActivityCompat.shouldShowRequestPermissionRationale 时,它也返回 false。表示用户要么从未被询问(这里的问题是什么接缝),要么被选中“不再显示”。应用信息显示“无需权限”。

我的问题与this 有关,但我已经按照答案中的建议请求了许可。

这是我的一些代码:

// firstly I call this function to check and request the permissions
private void checkPermissions(final String[] permissions) {
    for(final String permission : permissions) {
        if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, permission)) {
            ActivityCompat.requestPermissions(this, new String[]{permission}, PERMISSION_REQUEST);
        }
    }
}

// This results in this callback to be called. No dialog is shown.
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_REQUEST: {
            for (int i = 0; i < permissions.length; i++) {
                if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                    // The permmission is always denied ...
                    if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])) {
                        // and we should not show a request. We always end up here
                    } else {
                        // here we should show the request again, but we dont end up here
                    }
                }
            }
        }
    }
}

感谢任何提示我在这里忽略的内容。

【问题讨论】:

    标签: android android-permissions


    【解决方案1】:

    您的String[] permissions 数组包含什么?你应该只调用一次requestPermissions,传递带有所有需要(未授予)权限的数组,而不是分别用每个需要的权限调用这个方法。可能在位置一之前拒绝了另一个权限,并且位置权限请求不会发出,因为Activity 松散焦点和进一步/多个requestPermissions 没有操作

    private void checkPermissions(final String[] permissions) {
        ArrayList<String> neededPerms = new ArrayList<>();
        for(final String permission : permissions) {
            if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, permission)) {
                neededPerms.add(permission);
            }
        }
        if(neededPerms.size()>0){
            String[] array = new String[neededPerms.size()];
            neededPerms.toArray(array);
            ActivityCompat.requestPermissions(this, array, PERMISSION_REQUEST);
        }
    }
    

    【讨论】:

    • 感谢您的提示。我为我的 BLE 应用请求 {ACCESS_FINE_LOCATION, BLUETOOTH, BLUETOOTH_ADMIN}。然而,只有 ACCESS_FINE_LOCATION 没有给出(出于某种原因),并且“ActivityCompat.requestPermissions”只被调用一次。但我会添加它以防止将来出现错误。但是行为没有改变,问题仍然存在......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 2021-06-29
    相关资源
    最近更新 更多