所以我已经坐在这里4个小时了,为什么我的2台设备行为不正常,我挠头。 问题是,即使授予了权限,checkSelfPermission也会返回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;
}
}
现在,每当我第一次打开具有此代码的活动(BaseActivity
)时,它就会按预期工作,并要求用户提供存储权限。
但是,在此活动中的片段中,我想访问文件的地方,每当我调用此方法时,它就开始返回false。
我已经公开了此方法,并且根据情况返回了true / false。
这是我检查是否在Fragment中授予权限的方法。
if (!((BaseActivity) getActivity()).isStoragePermissionGranted()) {
Toast.makeText(getActivity(), getString(R.string.storagePermissionError), Toast.LENGTH_LONG).show();
break;
}
我在compileSdkVersion
和targetSdkVersion
28上,所以范围内的外部存储权限应该不是问题。我在这里做错了什么?为什么即使我100%授予了我的应用程序存储权限,isStoragerPermissionGranted()
方法也总是返回false
?
答案 0 :(得分:0)
所以我发现了应用程序出了什么问题。 问题是Vungle ads 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"/>
设置为在您自己的maxSdkVersion
中设置了Manifest.xml
的标签。
答案 1 :(得分:-1)
尝试了很多东西后,这种方法对我来说效果很好
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);
}