Skip to content

Commit

Permalink
update external storage permission request
Browse files Browse the repository at this point in the history
- manage external storage for Android API30 and above
- open App Details Settings if permission has been denied by user
for Android API29 and below
- add requestLegacyExternalStorage for Android 10 to allow access
external storage
  • Loading branch information
bmx666 committed Jun 29, 2023
1 parent df50255 commit 73ab548
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 36 deletions.
5 changes: 3 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@
xmlns:android="http://schemas.android.com/apk/res/android">

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="32"
tools:ignore="ScopedStorage" />
android:maxSdkVersion="29" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>

<application
android:requestLegacyExternalStorage="true"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:label="@string/app_name"
Expand Down
108 changes: 74 additions & 34 deletions app/src/main/java/com/midisheetmusic/SplashActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,16 @@
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.Settings;

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
Expand All @@ -21,53 +28,86 @@
*/
public class SplashActivity extends AppCompatActivity {

private static final int PERMISSION_REQUEST_CODE_EXT_STORAGE_ = 724;
private SplashScreen splashScreen;
private final String requestPermission = Manifest.permission.WRITE_EXTERNAL_STORAGE;
private final ActivityResultLauncher<String> requestPermissionLauncher =
registerForActivityResult(
new ActivityResultContracts.RequestPermission(),
this::checkPermissionApi21AfterResult);
private boolean waitForPermission = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
final SplashScreen splashScreen = SplashScreen.installSplashScreen(this);
splashScreen = SplashScreen.installSplashScreen(this);
super.onCreate(savedInstanceState);
// Keep the splash screen visible for this Activity
splashScreen.setKeepOnScreenCondition(() -> true );
loadImages();
startActivity();
waitForPermission = true;
}

/** Check for required permissions and start ChooseSongActivity */
private void startActivity() {
// Check if we have WRITE_EXTERNAL_STORAGE permission
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
PERMISSION_REQUEST_CODE_EXT_STORAGE_);
@Override
protected void onResume() {
super.onResume();

if (!waitForPermission)
return;
waitForPermission = false;

splashScreen.setKeepOnScreenCondition(() -> {
checkPermission(
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
? Environment.isExternalStorageManager()
: (ContextCompat.checkSelfPermission(this, requestPermission)
== PackageManager.PERMISSION_GRANTED)
);
return false;
});
}

/** check permission **/
private void checkPermission(boolean granted) {
if (granted) {
Intent intent = new Intent(this, ChooseSongActivity.class);
startActivity(intent);
finish();
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
requestPermissionApi30();
else
requestPermissionLauncher.launch(requestPermission);
}
}

@RequiresApi(api = Build.VERSION_CODES.R)
private void requestPermissionApi30() {
Uri uri = Uri.parse("package:" + BuildConfig.APPLICATION_ID);
startActivity(new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, uri));
waitForPermission = true;

Intent intent = new Intent(this, ChooseSongActivity.class);
startActivity(intent);
finish();
Snackbar.make(findViewById(android.R.id.content),
R.string.msg_permission_denied, Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.msg_permission_denied_retry, view -> requestPermissionApi30())
.show();
}

@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case PERMISSION_REQUEST_CODE_EXT_STORAGE_: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission granted
startActivity();
} else {
// permission denied
Snackbar.make(findViewById(android.R.id.content),
private void checkPermissionApi21AfterResult(boolean granted) {
if (granted)
checkPermission(true);
else
Snackbar.make(findViewById(android.R.id.content),
R.string.msg_permission_denied, Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.msg_permission_denied_retry, view -> startActivity())
.show();
}
}
.setAction(R.string.msg_permission_denied_retry, view -> {
requestPermissionApi21AfterResult();
})
.show();
}

private void requestPermissionApi21AfterResult() {
if (ActivityCompat.shouldShowRequestPermissionRationale(SplashActivity.this, requestPermission)) {
requestPermissionLauncher.launch(requestPermission);
} else {
Uri uri = Uri.parse("package:" + BuildConfig.APPLICATION_ID);
startActivity(new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, uri));
waitForPermission = true;
}
}

Expand Down

0 comments on commit 73ab548

Please sign in to comment.