anroid存储权限的最佳适配针对android11也就是api29问题解决EPERMoperationnotpermitted
简书链接:anroid存储权限的最佳适配针对android11也就是api29问题解决EPERMoperationnotpermitted
文章字数:540,阅读全文大约需要2分钟
昨天本来想写一个demo,然后放到手机上用神之手hook,然后用我的hookui测试批量修改集合内模型数据,没想到这么简单的问题都搞不定了。。
权限申请了,清单文件也定义了,也手动进入设置给了存储权限,然后今天动态调用了权限申请了,
还是提示EPERM operation not permitted
网络上说的的在application节点
1 |
|
1 |
|
/>
<application
android:requestLegacyExternalStorage="true"
1 |
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && false == Environment.isExternalStorageManager()) {
Uri uri = Uri.parse(“package:” + BuildConfig.APPLICATION_ID);
startActivity(new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, uri));
}else{
callPermissionLogic(this, 0);
}
1 |
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && false == Environment.isExternalStorageManager()) {
Uri uri = Uri.parse("package:" + BuildConfig.APPLICATION_ID);
startActivity(new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, uri));
}else{
callPermissionLogic(this, 0);
}
}
private static final int REQUEST_CODE_SELECT_PLUGIN = 1;
private boolean mChanage;
private int _CurrentPermissionIndex;
List<String> waitRequestPermissionList = new ArrayList<>();
{
waitRequestPermissionList.add(Manifest.permission.READ_EXTERNAL_STORAGE);
waitRequestPermissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
private int callPermissionLogic(Activity activity, final int from) {
int breakFlag = -1;
for (int i = from; i < waitRequestPermissionList.size(); i++) {
final String currentPermission = waitRequestPermissionList.get(i);
_CurrentPermissionIndex = i;
final int finalI = i;
if (PermissionUtil.checkSelfPermission(this, currentPermission) != PackageManager.PERMISSION_GRANTED) {
breakFlag = i;
if (PermissionUtil.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
Log.w("PermissionRequest", "shouldShowRequestPermissionRationale call");
Toast.makeText(activity, "权限被拒绝" + currentPermission + ",你可以再次申请", Toast.LENGTH_SHORT).show();
callPermissionLogic(activity, from + 1);
} else {
PermissionUtil.requestPermissions(this, new String[]{currentPermission}, i);
if (BuildConfig.DEBUG) {
Log.w("PermissionRequest", "第一次或者最后一次权限申请 " + currentPermission);
}
}
} else {
if (BuildConfig.DEBUG) {
Log.w("PermissionRequest", "权限" + currentPermission + "已拥有...");
}
}
}
return breakFlag;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
PermissionUtil.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
//onRequestPermissionsResult requestCode:1,permission:[android.permission.FOREGROUND_SERVICE],grantResult:[-1]
if (BuildConfig.DEBUG) {
Log.w(“PermissionRequest”, “onRequestPermissionsResult requestCode:” + requestCode + “,permission:” + Arrays.toString(permissions) + “,grantResult:” + Arrays.toString(grantResults));
}
_CurrentPermissionIndex++;
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && permissions[0].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
} else {
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
1 | 在上面代码可以找到如下行 |
Toast.makeText(activity, “权限被拒绝” + currentPermission + “,你可以再次申请”, Toast.LENGTH_SHORT).show();
1 |
|
Log.w(“PermissionRequest”, “shouldShowRequestPermissionRationale call”);
DialogUtils.showConfirmDialog(this, “年轻人,权限不用轻易拒绝啊,再给你一次机会,我需要申请” + currentPermission + “权限,这个权限有利于机器人程序得问题哈!”, new INotify
@Override
public void onNotify(Void param) {
PermissionUtil.requestPermissions(activity, new String[]{currentPermission}, finalI);
}
}, new INotify
@Override
public void onNotify(Void param) {
callPermissionLogic(activity,from + 1);
}
});
1 |
|
package cn.qssq666.robot.utils;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import androidx.annotation.NonNull;
import android.util.Log;
import android.view.WindowManager;
import java.util.Arrays;
/**
- Created by qssq on 2018/4/21 qssq666@foxmail.com
*/
public class PermissionUtil {
private static final String TAG = "PermissionUtil";
public static boolean debug=true;
public static void onRequestPermissionsResult(Activity activity, int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
Log.w(TAG, "onRequestPermissionsResult:" + " requestCode ,result:" + getPermissionsResultMsg(permissions, grantResults)+",grantResultslength:"+grantResults.length);
}
private static String getPermissionsResultMsg(String[] permissions, int[] grantResults) {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < permissions.length; i++) {
stringBuilder.append(printPermission(permissions[i]) + ":" + getResultMsg(grantResults[i]) + "\n");
}
return stringBuilder.toString();
}
public static void requestPermissions(Activity activity, String[] permissions, int requestCode) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
activity.requestPermissions(permissions,requestCode);
Log.w(TAG, "requestPermissions:" + printPermissions(permissions) + " requestCode" + requestCode);
}else{
}
}
public static int checkSelfPermission(Context activity, String permission) {
if(debug){
Log.w(TAG,"=========================================");
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int i = activity.checkSelfPermission(permission);
if (debug) {
Log.w(TAG, "checkSelfPermission:" + printPermission(permission) + ":" + getResultMsg(i));
}
return i;
}
if (debug) {
Log.w(TAG, "Build.VERSION.SDK_INT <23 checkSelfPermission:" + printPermission(permission) + ":" + getResultMsg(PackageManager.PERMISSION_GRANTED));
}
return PackageManager.PERMISSION_GRANTED;
}
public static String printPermission(String permission) {
return permission;
}
public static String printPermissions(String[] permission) {
return Arrays.toString(permission);
}
/*
是否应该显示 请求权限信息
*/
public static boolean shouldShowRequestPermissionRationale(Activity activity, String permissionRationale) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
boolean result = activity.shouldShowRequestPermissionRationale(permissionRationale);
if (debug) {
Log.w(TAG, "shouldShowRequestPermissionRationale:" + printPermission(permissionRationale) + " result" + getRationaleResultMsg(result));
}
} else {
Log.w(TAG, "shouldShowRequestPermissionRationale <23 false" );
}
return false;
}
private static String getRationaleResultMsg(boolean result) {
return result ? "应该显示权限说明" : "不应该显示权限说明";
}
public static String getResultMsg(int permissionCode) {
if (permissionCode == PackageManager.PERMISSION_GRANTED) {
return "获得/成功";
} else {
return "未获得/拒绝";
}
}
public static void showSystemDialog(Activity mainActivity) {
if(debug){
Log.w(TAG,"弹出系统对话框开始");
AlertDialog.Builder builder = new AlertDialog.Builder(mainActivity);
builder.setMessage("我是系统对话框");
Dialog dialog= builder.create();
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
// dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialog.show();
Log.w(TAG,"弹出系统对话框结束");
}
}
}