昨天本來(lái)想寫一個(gè)demo,然后放到手機(jī)上用神之手hook,然后用我的hookui測(cè)試批量修改集合內(nèi)模型數(shù)據(jù),沒(méi)想到這么簡(jiǎn)單的問(wèn)題都搞不定了。。
權(quán)限申請(qǐng)了,清單文件也定義了,也手動(dòng)進(jìn)入設(shè)置給了存儲(chǔ)權(quán)限,然后今天動(dòng)態(tài)調(diào)用了權(quán)限申請(qǐng)了,
還是提示EPERM operation not permitted
網(wǎng)絡(luò)上說(shuō)的的在application節(jié)點(diǎn)
android:requestLegacyExternalStorage="true"前幾天我用這個(gè)方法解決了,可能是因?yàn)榫幾gtagetSdk版本不夠高吧,才勉強(qiáng)解決了問(wèn)題,但是今天這樣設(shè)置也沒(méi)效果了,。
進(jìn)入清單文件選擇
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
WRITE_EXTERNAL_STORAGE no longer provides write access when targeting Android 11+, even when using requestLegacyExternalStorage
于是根據(jù)這個(gè)關(guān)鍵詞搜索才找到解決方案,
解決方法如下:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29"
tools:ignore="ScopedStorage"
/>
<application
android:requestLegacyExternalStorage="true"
java層對(duì)于android 11的代碼
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);
}
我寫的完整代碼,不用任何框架
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, "權(quán)限被拒絕" + currentPermission + ",你可以再次申請(qǐng)", Toast.LENGTH_SHORT).show();
callPermissionLogic(activity, from + 1);
} else {
PermissionUtil.requestPermissions(this, new String[]{currentPermission}, i);
if (BuildConfig.DEBUG) {
Log.w("PermissionRequest", "第一次或者最后一次權(quán)限申請(qǐng) " + currentPermission);
}
}
} else {
if (BuildConfig.DEBUG) {
Log.w("PermissionRequest", "權(quán)限" + 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);
}
在上面代碼可以找到如下行
Toast.makeText(activity, "權(quán)限被拒絕" + currentPermission + ",你可以再次申請(qǐng)", Toast.LENGTH_SHORT).show();
可以替換成下面的再次調(diào)用
Log.w("PermissionRequest", "shouldShowRequestPermissionRationale call");
DialogUtils.showConfirmDialog(this, "年輕人,權(quán)限不用輕易拒絕啊,再給你一次機(jī)會(huì),我需要申請(qǐng)" + currentPermission + "權(quán)限,這個(gè)權(quán)限有利于機(jī)器人程序得問(wèn)題哈!", new INotify<Void>() {
@Override
public void onNotify(Void param) {
PermissionUtil.requestPermissions(activity, new String[]{currentPermission}, finalI);
}
}, new INotify<Void>() {
@Override
public void onNotify(Void param) {
callPermissionLogic(activity,from + 1);
}
});
關(guān)于android11的問(wèn)題看看大神們?cè)趺从懻摰摹?/p>
https://stackoverflow.com/questions/64221188/write-external-storage-when-targeting-android-10