在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
除外。
可能是操作系统问题?
答案 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);
}