Merge pull request #13203 from farmerbb/master

[Android / Play Store] Implement MANAGE_EXTERNAL_STORAGE permission
This commit is contained in:
Autechre 2021-11-08 16:33:25 +01:00 committed by GitHub
commit edd446929b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 56 additions and 13 deletions

View File

@ -1,5 +1,6 @@
.gradle .gradle
.externalNativeBuild .externalNativeBuild
.cxx
build build
phoenix.iml phoenix.iml
output.json output.json

View File

@ -12,6 +12,7 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.VIBRATE" />

View File

@ -25,8 +25,8 @@ allprojects {
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
android { android {
compileSdkVersion 29 compileSdkVersion 30
buildToolsVersion "29.0.3" buildToolsVersion "30.0.3"
ndkVersion "22.0.7026061" ndkVersion "22.0.7026061"
flavorDimensions "variant" flavorDimensions "variant"
@ -72,7 +72,7 @@ android {
} }
playStoreNormal { playStoreNormal {
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 29 targetSdkVersion 30
versionCode getPlayStoreVersionCode() versionCode getPlayStoreVersionCode()
versionName getPlayStoreVersionName() versionName getPlayStoreVersionName()
@ -83,7 +83,7 @@ android {
} }
playStorePlus { playStorePlus {
minSdkVersion 26 minSdkVersion 26
targetSdkVersion 29 targetSdkVersion 30
versionCode getPlayStoreVersionCode() versionCode getPlayStoreVersionCode()
versionName getPlayStoreVersionName() versionName getPlayStoreVersionName()

View File

@ -3,10 +3,11 @@ package com.retroarch.browser.mainmenu;
import com.retroarch.browser.preferences.util.UserPreferences; import com.retroarch.browser.preferences.util.UserPreferences;
import com.retroarch.browser.retroactivity.RetroActivityFuture; import com.retroarch.browser.retroactivity.RetroActivityFuture;
import android.content.ActivityNotFoundException;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.media.AudioManager; import android.media.AudioManager;
import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Environment; import android.os.Environment;
@ -21,6 +22,7 @@ import android.Manifest;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.util.Log; import android.util.Log;
import android.widget.Toast;
/** /**
* {@link PreferenceActivity} subclass that provides all of the * {@link PreferenceActivity} subclass that provides all of the
@ -31,6 +33,7 @@ public final class MainMenuActivity extends PreferenceActivity
final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124; final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;
public static String PACKAGE_NAME; public static String PACKAGE_NAME;
boolean checkPermissions = false; boolean checkPermissions = false;
boolean checkManageExternalStoragePermission = false;
public void showMessageOKCancel(String message, DialogInterface.OnClickListener onClickListener) public void showMessageOKCancel(String message, DialogInterface.OnClickListener onClickListener)
{ {
@ -64,12 +67,25 @@ public final class MainMenuActivity extends PreferenceActivity
List<String> permissionsNeeded = new ArrayList<String>(); List<String> permissionsNeeded = new ArrayList<String>();
final List<String> permissionsList = new ArrayList<String>(); final List<String> permissionsList = new ArrayList<String>();
if (!addPermission(permissionsList, Manifest.permission.READ_EXTERNAL_STORAGE)) final boolean requiresManageExternalStoragePermission =
permissionsNeeded.add("Read External Storage"); getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.Q
if (!addPermission(permissionsList, Manifest.permission.WRITE_EXTERNAL_STORAGE)) && Build.VERSION.SDK_INT > Build.VERSION_CODES.Q;
permissionsNeeded.add("Write External Storage");
if (permissionsList.size() > 0) boolean shouldRequestManageExternalStoragePermission = false;
if (requiresManageExternalStoragePermission) {
if (!Environment.isExternalStorageManager()) {
shouldRequestManageExternalStoragePermission = true;
permissionsNeeded.add("Manage External Storage");
}
} else {
if (!addPermission(permissionsList, Manifest.permission.READ_EXTERNAL_STORAGE))
permissionsNeeded.add("Read External Storage");
if (!addPermission(permissionsList, Manifest.permission.WRITE_EXTERNAL_STORAGE))
permissionsNeeded.add("Write External Storage");
}
if (permissionsList.size() > 0 || shouldRequestManageExternalStoragePermission)
{ {
checkPermissions = true; checkPermissions = true;
@ -91,10 +107,26 @@ public final class MainMenuActivity extends PreferenceActivity
{ {
if (which == AlertDialog.BUTTON_POSITIVE) if (which == AlertDialog.BUTTON_POSITIVE)
{ {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) if (requiresManageExternalStoragePermission) {
{ checkManageExternalStoragePermission = true;
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.setData(Uri.fromParts("package", getPackageName(), null));
try {
startActivity(intent);
} catch (ActivityNotFoundException e) {
// Redirect to app info page instead, so that the user can manually grant the permission
String text = "Navigate to Permissions -> Files and media -> Allow all the time";
Toast.makeText(MainMenuActivity.this, text, Toast.LENGTH_LONG).show();
intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", getPackageName(), null));
startActivity(intent);
}
} else {
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
Log.i("MainMenuActivity", "User accepted request for external storage permissions."); Log.i("MainMenuActivity", "User accepted request for external storage permissions.");
} }
@ -194,4 +226,13 @@ public final class MainMenuActivity extends PreferenceActivity
checkRuntimePermissions(); checkRuntimePermissions();
} }
@Override
public void onTopResumedActivityChanged(boolean onTop) {
if(onTop && checkManageExternalStoragePermission) {
checkPermissions = false;
checkManageExternalStoragePermission = false;
checkRuntimePermissions();
}
}
} }