如果您在文件权限方面有问题,下面的解决方案在API 27、29和30上适用于我。我还没有尝试使用28,但我认为它也适用于28,因为文件访问权限与API版本29不同。
发布于 2022-03-11 13:03:16
AndroidManifest.xml,
<manifest
...
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="29"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="29"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
...
<application
...
android:requestLegacyExternalStorage="true"
>
...
</application>
</manifest>main.java
private static final int PERMISSIONS_REQUEST_CODE = 1240;
private ArrayList<String> appPermissions;
private ActivityResultLauncher<Intent> permissionLauncher;
private void checkPermissionsGranted() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if ( !Environment.isExternalStorageManager() ) {
requestPermission();
} else {
// app has permissions, init app
initApp();
}
} else {
// older API-Versions
checkAndRequestPermissions();
}
}
private void requestPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
permissionLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(), result -> {
if (result.getResultCode() == Activity.RESULT_OK) {
// app has permissions, init app
initApp();
} else {
//permission is denied
finish();
}
});
try {
Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse(String.format("package:%s", getApplicationContext().getPackageName())));
// startActivityForResult(intent, AppConstants.STORAGE_PERMISSION_CODE);
permissionLauncher.launch(intent);
} catch (Exception e) {
Log.e(TAG, "Exp... " + e.toString());
Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
permissionLauncher.launch(intent);
}
}
}
public void checkAndRequestPermissions(){
// check which permissions are granted
List<String> listPermissionsNeeded = new ArrayList<>();
for (String perm:appPermissions){
if (ContextCompat.checkSelfPermission(this, perm) != PackageManager.PERMISSION_GRANTED){
listPermissionsNeeded.add(perm);
}
}
// ask for non-granted
if (!listPermissionsNeeded.isEmpty()){
ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), PERMISSIONS_REQUEST_CODE);
} else {
// app has all permissions, init app
initApp();
}
}
private void initApp() {
/**
* TODO
* */
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSIONS_REQUEST_CODE) {
HashMap<String, Integer> permissionResults = new HashMap<>();
int deniedCount = 0;
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
permissionResults.put(permissions[i], grantResults[i]);
deniedCount++;
}
}
if (deniedCount == 0) {
// app has all permissions, init app
initApp();
} else {
// denied
for (Map.Entry<String, Integer> entry : permissionResults.entrySet()) {
String permName = entry.getKey();
int permResult = entry.getValue();
// permission is denied (this is first time, when "newer ask again" is not checked)
if (ActivityCompat.shouldShowRequestPermissionRationale(this, permName)) {
// show dialog
new MaterialAlertDialogBuilder(MainActivity.this)
.setTitle("Title")
.setMessage(getString(R.string.confirmation_permissions))
.setPositiveButton(getString(R.string.confirm_permissions_ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
checkAndRequestPermissions();
}
})
.setNegativeButton(getString(R.string.confirm_permissions_cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
// finish App
finish();
}
})
.show();
} else {
//permission is denied ("newer ask again" is checked)
finish();
}
}
}
}
}https://stackoverflow.com/questions/71438946
复制相似问题