始终未授予OS 4.0 READ_EXTERNAL_STORAGE权限上的Android Marshmallow权限模型

时间:2015-11-02 16:35:46

标签: android android-permissions android-6.0-marshmallow

在Android OS 4.0上运行我的应用并在以下位置申请ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2); ExchangeCredentials credentials = new WebCredentials("emailAddress", "password"); service.setCredentials(credentials); 权限时出现问题:

READ_EXTERNAL_STORAGE

我总是接受回调

ActivityCompat.requestPermissions(ctx, requestedPermissions, requestCode);

使用public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { grantResults != PackageManager.PERMISSION_GRANTED 检查权限始终返回ActivityCompat.checkSelfPermission

通过系统对话框请求权限,在OS 6.0上运行良好。 Android OS 4.x除了4.0之外,总是授予权限。 OS 4.0的其他权限(相机,日历,联系人,电话)表现良好,但导致此问题的permissionDenied除外。

可能是操作系统问题?

2 个答案:

答案 0 :(得分:11)

What ActivityCompat.requestPermissions() does是:

  • 如果您使用的是Android 6.0及以上,请致电真实requestPermissions(),或

  • 使用PackageManager查看您是否在旧版Android上保留所请求的权限

READ_EXTERNAL_STORAGE的问题在于它是在API级别16(Android 4.1)中添加的。你不能在旧的Android版本上保留它,原因很简单,因为它不存在。

或者:

  • minSdkVersion设置为16,或

  • 使用您自己的逻辑来处理这种情况,认识到{16}之前READ_EXTERNAL_STORAGE无关紧要

答案 1 :(得分:0)

我在 Android 8.0 上处理 FOREGROUND_SERVICE 时发现了这个问题。不幸的是,我的解决方案取决于异常处理,但它不需要处理支持权限的 API 级别。您可以使用此方法检查当前 API 级别是否存在权限:

private boolean permissionExistsOnCurrentApiLevel(String permission) {
    try {
        getPackageManager().getPermissionInfo(permission, PackageManager.GET_META_DATA);
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }

    return true;
}

使用此方法,您可以实现自己的 ContextCompat.checkSelfPermission 版本,其中所有不存在的权限都会被自动视为已授予:

private int myCheckSelfPermission(@NonNull Context context, @NonNull String permission) {
    if(!permissionExistsOnCurrentApiLevel(permission)) {
        return PackageManager.PERMISSION_GRANTED;
    }

    return ContextCompat.checkSelfPermission(this, permission);
}