大家好,我想在我的代码中添加Android11及以上版本的存储权限,尽管添加了下面的权限()
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="29"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />清单中的我不能访问android 11的存储程序,您能给我必要的代码来添加这个权限管理器吗?
public abstract class PermissionsManager implements ActivityCompat.OnRequestPermissionsResultCallback {
private Activity activity;
private boolean grantedPermissions;
private String[] permissions;
private int requestCode;
protected PermissionsManager(Activity activity) {
this.activity = activity;
((MainActivity) activity).setOnRequestPermissionsResultListener(this);
}
private boolean notGrantedPermission(String permission) {
return ContextCompat.checkSelfPermission(activity, permission) != PackageManager
.PERMISSION_GRANTED;
}
public void checkPermissions(String permission, int requestCode) {
try {
checkPermissions(new String[]{permission}, requestCode);
}//end try
catch (Exception e){
e.printStackTrace();
}// end catch
}
public void checkPermissions(String[] permissions, int requestCode) {
try {
this.permissions = permissions;
this.requestCode = requestCode;
for (String permission : permissions) {
if (notGrantedPermission(permission)) {
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) {
showRequestPermissionRationale();
} else {
requestPermissions();
}
break;
} else grantedPermissions = true;
}
if (grantedPermissions) onPermissionsGranted();
}//end try
catch (Exception e){
e.printStackTrace();
}// catch
}
public void requestPermissions() {
ActivityCompat.requestPermissions(activity, permissions, requestCode);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
for (int i = 0; i < permissions.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
if (!ActivityCompat.shouldShowRequestPermissionRationale(activity,
permissions[i])) {
grantedPermissions = false;
requestDisallowedAction();
} else {
grantedPermissions = false;
onPermissionsDenied();
}
break;
} else grantedPermissions = true;
}
if (grantedPermissions) onPermissionsGranted();
}
/**
* add code here to tell users what permissions you need granted and why you need each
* permission. Should call requestPermissions() after showing rationale.
*/
public abstract void showRequestPermissionRationale();
/**
* add code here when permissions can't be requested. Either disable feature, direct user to
* settings to allow user to set permissions, ask user to uninstall, or etc.
*/
public abstract void requestDisallowedAction();
public abstract void onPermissionsGranted();
public abstract void onPermissionsDenied();}
发布于 2022-03-03 11:39:12
是的,是真的。虽然与Android 11和Android 10相比,由于安全问题,google更新了很多变化。
不,这不是许可问题。如果您尝试访问此路径mnt/sdcard/其限制现在。如果应用程序没有选择退出作用域存储,并请求READ_EXTERNAL_STORAGE许可。
请参考此链接https://developer.android.com/about/versions/11/privacy/storage
解决方案1-尝试使用此文件访问路径是Android/data/data/packageName/
我的意思是,如果您使用这个逻辑来访问文件- Environment.getExternalStorageDirectory()而不是上面的话,那么尝试this - Context.getExternalFilesDir(null)
解决方案2-如果您管理媒体文件,然后尝试引用此链接https://source.android.com/devices/media/media-provider
我希望它能帮助你..。
https://stackoverflow.com/questions/70054066
复制相似问题