即使授予权限,checkSelfPermission 也会返回 false
checkSelfPermission returning false even if Permission is granted
所以我已经在这里坐了 4 个小时了,绞尽脑汁想知道为什么我的 2 台设备运行不正常。
问题是,checkSelfPermission 是 returning false,即使授予了权限!
我 100% 确定这不应该发生,因为它在 5-6 天前按预期工作。
这是我用来检查权限是否被授予的代码。
public boolean isStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= 23) {
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
Log.v("BaseActivity", "Permission is granted");
return true;
} else {
Log.v("BaseActivity", "Storage Permission is revoked");
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
return false;
}
} else { //permission is automatically granted on sdk<23 upon installation
Log.v("BaseActivity", "Permission is granted");
return true;
}
}
现在,每当我第一次打开具有此代码的 activity (BaseActivity
) 时,它都会按预期工作并请求用户获得存储权限。
但是,在这个 activity 的片段中,我想访问文件的地方,每当我调用这个方法时,它就开始 returning false。
这个方法我做了public,用过returntrue/false视情况而定。
下面是我如何检查是否在 Fragment 中授予了权限。
if (!((BaseActivity) getActivity()).isStoragePermissionGranted()) {
Toast.makeText(getActivity(), getString(R.string.storagePermissionError), Toast.LENGTH_LONG).show();
break;
}
我在 compileSdkVersion
和 targetSdkVersion
28,所以范围内的外部存储权限应该不是问题。我在这里做错了什么?为什么 isStoragerPermissionGranted()
方法总是 returning false
即使我 100% 已经授予我的应用程序 STORAGE 权限?
所以我发现应用程序出了什么问题。
问题出在 Vungle 广告 SDK,它设置了
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
并且根据 https://developer.android.com/guide/topics/manifest/uses-permission-element#maxSdk 系统不会授予 WRITE_EXTERNAL_STORAGE
权限,即使直接在“设置”本身中设置也是如此。
所以这个 SDK 设置了这个标签,很难找到,因为它在 Merged Manifest 里面,我幸运地发现了这个东西。
要在不从您的应用中删除 SDK 的情况下解决此问题,请执行以下操作:
添加 tools:remove="android:maxSdkVersion"
于是就变成了这样:
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:remove="android:maxSdkVersion"/>
到您自己 Manifest.xml
中设置了 maxSdkVersion
的标签。
在尝试了很多事情之后,这种方法对我来说效果很好
public boolean hasPermissions(Context context, String... permissions) {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
for (String permission : permissions) {
if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
}
return true;
}
权限数组
private String[] permissions = (new String[]{Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE});
如果调用
if (hasPermissions(this, permissions)) {
Intent intent = getPickIntent();
startActivityForResult(intent, 1001);
} else {
requestPermissions(new String[]{Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSION_CODE);
}
所以我已经在这里坐了 4 个小时了,绞尽脑汁想知道为什么我的 2 台设备运行不正常。 问题是,checkSelfPermission 是 returning false,即使授予了权限! 我 100% 确定这不应该发生,因为它在 5-6 天前按预期工作。 这是我用来检查权限是否被授予的代码。
public boolean isStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= 23) {
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
Log.v("BaseActivity", "Permission is granted");
return true;
} else {
Log.v("BaseActivity", "Storage Permission is revoked");
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
return false;
}
} else { //permission is automatically granted on sdk<23 upon installation
Log.v("BaseActivity", "Permission is granted");
return true;
}
}
现在,每当我第一次打开具有此代码的 activity (BaseActivity
) 时,它都会按预期工作并请求用户获得存储权限。
但是,在这个 activity 的片段中,我想访问文件的地方,每当我调用这个方法时,它就开始 returning false。
这个方法我做了public,用过returntrue/false视情况而定。
下面是我如何检查是否在 Fragment 中授予了权限。
if (!((BaseActivity) getActivity()).isStoragePermissionGranted()) {
Toast.makeText(getActivity(), getString(R.string.storagePermissionError), Toast.LENGTH_LONG).show();
break;
}
我在 compileSdkVersion
和 targetSdkVersion
28,所以范围内的外部存储权限应该不是问题。我在这里做错了什么?为什么 isStoragerPermissionGranted()
方法总是 returning false
即使我 100% 已经授予我的应用程序 STORAGE 权限?
所以我发现应用程序出了什么问题。 问题出在 Vungle 广告 SDK,它设置了
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
并且根据 https://developer.android.com/guide/topics/manifest/uses-permission-element#maxSdk 系统不会授予 WRITE_EXTERNAL_STORAGE
权限,即使直接在“设置”本身中设置也是如此。
所以这个 SDK 设置了这个标签,很难找到,因为它在 Merged Manifest 里面,我幸运地发现了这个东西。
要在不从您的应用中删除 SDK 的情况下解决此问题,请执行以下操作:
添加 tools:remove="android:maxSdkVersion"
于是就变成了这样:
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:remove="android:maxSdkVersion"/>
到您自己 Manifest.xml
中设置了 maxSdkVersion
的标签。
在尝试了很多事情之后,这种方法对我来说效果很好
public boolean hasPermissions(Context context, String... permissions) {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
for (String permission : permissions) {
if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
}
return true;
}
权限数组
private String[] permissions = (new String[]{Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE});
如果调用
if (hasPermissions(this, permissions)) {
Intent intent = getPickIntent();
startActivityForResult(intent, 1001);
} else {
requestPermissions(new String[]{Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSION_CODE);
}