Skip to content

Commit

Permalink
Upgrade support for Granular media permissions in Android 33
Browse files Browse the repository at this point in the history
  • Loading branch information
javaherisaber committed Oct 25, 2022
1 parent ac1940c commit 261f446
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 20 deletions.
2 changes: 1 addition & 1 deletion android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ rootProject.allprojects {
apply plugin: 'com.android.library'

android {
compileSdkVersion 30
compileSdkVersion 33

defaultConfig {
minSdkVersion 16
Expand Down
8 changes: 7 additions & 1 deletion android/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,13 @@
xmlns:tools="http://schemas.android.com/tools"
package="com.crazecoder.openfile">

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />

<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />

<application>
<provider
Expand Down
40 changes: 22 additions & 18 deletions android/src/main/java/com/crazecoder/openfile/OpenFilePlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,10 @@ private boolean hasPermission(String permission) {
return ContextCompat.checkSelfPermission(activity, permission) == PermissionChecker.PERMISSION_GRANTED;
}

private void requestPermission(String permission) {
ActivityCompat.requestPermissions(activity, new String[]{permission}, REQUEST_CODE);
}

@Override
@SuppressLint("NewApi")
public void onMethodCall(MethodCall call, @NonNull Result result) {
Expand All @@ -101,19 +105,21 @@ public void onMethodCall(MethodCall call, @NonNull Result result) {
if(!isFileAvailable()){
return;
}
if (!isMediaStorePath()&&!Environment.isExternalStorageManager()) {
if (!isMediaStorePath() && !Environment.isExternalStorageManager()) {
result(-3, "Permission denied: android.Manifest.permission.MANAGE_EXTERNAL_STORAGE");
return;
}
}
if (hasPermission(Manifest.permission.READ_EXTERNAL_STORAGE)) {
if (TYPE_STRING_APK.equals(typeString)) {
openApkFile();
return;
}
if (canStartActivityWithPermission()) {
startActivity();
} else {
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE);
} else if (Build.VERSION.SDK_INT < 33) {
requestPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
} else if (typeString.startsWith("image")) {
requestPermission(Manifest.permission.READ_MEDIA_IMAGES);
} else if (typeString.startsWith("video")) {
requestPermission(Manifest.permission.READ_MEDIA_VIDEO);
} else if (typeString.startsWith("audio")) {
requestPermission(Manifest.permission.READ_MEDIA_AUDIO);
}
} else {
startActivity();
Expand All @@ -124,6 +130,14 @@ public void onMethodCall(MethodCall call, @NonNull Result result) {
}
}

private boolean canStartActivityWithPermission() {
return (Build.VERSION.SDK_INT < 33 && hasPermission(Manifest.permission.READ_EXTERNAL_STORAGE)) ||
(Build.VERSION.SDK_INT >= 33 && typeString.startsWith("image") && hasPermission(Manifest.permission.READ_MEDIA_IMAGES)) ||
(Build.VERSION.SDK_INT >= 33 && typeString.startsWith("video") && hasPermission(Manifest.permission.READ_MEDIA_VIDEO)) ||
(Build.VERSION.SDK_INT >= 33 && typeString.startsWith("audio") && hasPermission(Manifest.permission.READ_MEDIA_AUDIO)) ||
(Build.VERSION.SDK_INT >= 33 && !(typeString.startsWith("image") || typeString.startsWith("video") || typeString.startsWith("audio")));
}

private boolean isMediaStorePath(){
boolean isMediaStorePath = false;
String[] mediaStorePath = {"/DCIM/"
Expand Down Expand Up @@ -351,20 +365,10 @@ private String getFileType(String filePath) {
}
}

@RequiresApi(api = Build.VERSION_CODES.M)
private void openApkFile() {
startActivity();
}

@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public boolean onRequestPermissionsResult(int requestCode, String[] strings, int[] grantResults) {
if (requestCode != REQUEST_CODE) return false;
if (hasPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
&& TYPE_STRING_APK.equals(typeString)) {
openApkFile();
return false;
}
for (String string : strings) {
if (!hasPermission(string)) {
result(-3, "Permission denied: " + string);
Expand Down

0 comments on commit 261f446

Please sign in to comment.