Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Android] remove unnecessary external storage permission #1453

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 6.2.1
### Android
Fix [#872](https://github.com/miguelpruivo/flutter_file_picker/issues/872)

## 8.1.2
### Android
- Fixes a cache deletion issue [#1505](https://github.com/miguelpruivo/flutter_file_picker/issues/1505)
Expand Down
13 changes: 6 additions & 7 deletions android/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mr.flutter.plugin.filepicker">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>
<queries>
<intent>
<action android:name="android.intent.action.GET_CONTENT" />
<data android:mimeType="*/*"/>
<queries>
<intent>
<action android:name="android.intent.action.GET_CONTENT" />
<data android:mimeType="*/*" />
</intent>
</queries>
</manifest>
</queries>
</manifest>
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,13 @@
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.PluginRegistry;

public class FilePickerDelegate implements PluginRegistry.ActivityResultListener, PluginRegistry.RequestPermissionsResultListener {
public class FilePickerDelegate implements PluginRegistry.ActivityResultListener {

private static final String TAG = "FilePickerDelegate";
private static final int REQUEST_CODE = (FilePickerPlugin.class.hashCode() + 43) & 0x0000ffff;
private static final int SAVE_FILE_CODE = (FilePickerPlugin.class.hashCode() + 83) & 0x0000ffff;

private final Activity activity;
private final PermissionManager permissionManager;
private MethodChannel.Result pendingResult;
private boolean isMultipleSelection = false;
private boolean loadDataToMemory = false;
Expand All @@ -51,20 +50,7 @@ public class FilePickerDelegate implements PluginRegistry.ActivityResultListener
public FilePickerDelegate(final Activity activity) {
this(
activity,
null,
new PermissionManager() {
@Override
public boolean isPermissionGranted(final String permissionName) {
return ActivityCompat.checkSelfPermission(activity, permissionName)
== PackageManager.PERMISSION_GRANTED;
}

@Override
public void askForPermission(final String permissionName, final int requestCode) {
ActivityCompat.requestPermissions(activity, new String[]{permissionName}, requestCode);
}

}
null
);
}

Expand All @@ -73,10 +59,9 @@ public void setEventHandler(final EventChannel.EventSink eventSink) {
}

@VisibleForTesting
FilePickerDelegate(final Activity activity, final MethodChannel.Result result, final PermissionManager permissionManager) {
FilePickerDelegate(final Activity activity, final MethodChannel.Result result) {
this.activity = activity;
this.pendingResult = result;
this.permissionManager = permissionManager;
}


Expand Down Expand Up @@ -223,25 +208,6 @@ public void run() {
return false;
}

@Override
public boolean onRequestPermissionsResult(final int requestCode, final String[] permissions, final int[] grantResults) {

if (REQUEST_CODE != requestCode) {
return false;
}

final boolean permissionGranted =
grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;

if (permissionGranted) {
this.startFileExplorer();
} else {
finishWithError("read_external_storage_denied", "User did not allow reading external storage");
}

return true;
}

private boolean setPendingMethodCallAndResult(final MethodChannel.Result result) {
if (this.pendingResult != null) {
return false;
Expand Down Expand Up @@ -315,16 +281,8 @@ public void startFileExplorer(final String type, final boolean isMultipleSelecti
this.isMultipleSelection = isMultipleSelection;
this.loadDataToMemory = withData;
this.allowedExtensions = allowedExtensions;
this.compressionQuality=compressionQuality;
// `READ_EXTERNAL_STORAGE` permission is not needed since SDK 33 (Android 13 or higher).
// `READ_EXTERNAL_STORAGE` & `WRITE_EXTERNAL_STORAGE` are no longer meant to be used, but classified into granular types.
// Reference: https://developer.android.com/about/versions/13/behavior-changes-13
if (Build.VERSION.SDK_INT < 33) {
if (!this.permissionManager.isPermissionGranted(Manifest.permission.READ_EXTERNAL_STORAGE)) {
this.permissionManager.askForPermission(Manifest.permission.READ_EXTERNAL_STORAGE, REQUEST_CODE);
return;
}
}
this.compressionQuality=compressionQuality;

this.startFileExplorer();
}

Expand Down Expand Up @@ -409,11 +367,4 @@ public void handleMessage(final Message message) {
private void clearPendingResult() {
this.pendingResult = null;
}

interface PermissionManager {
boolean isPermissionGranted(String permissionName);

void askForPermission(String permissionName, int requestCode);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -253,16 +253,21 @@ public void onCancel(final Object arguments) {
}
});
this.observer = new LifeCycleObserver(activity);
// V2 embedding setup for activity listeners.
activityBinding.addActivityResultListener(this.delegate);
activityBinding.addRequestPermissionsResultListener(this.delegate);
this.lifecycle = FlutterLifecycleAdapter.getActivityLifecycle(activityBinding);
this.lifecycle.addObserver(this.observer);

if (registrar != null) {
// V1 embedding setup for activity listeners.
application.registerActivityLifecycleCallbacks(this.observer);
registrar.addActivityResultListener(this.delegate);
} else {
// V2 embedding setup for activity listeners.
activityBinding.addActivityResultListener(this.delegate);
this.lifecycle = FlutterLifecycleAdapter.getActivityLifecycle(activityBinding);
this.lifecycle.addObserver(this.observer);
}
}

private void tearDown() {
this.activityBinding.removeActivityResultListener(this.delegate);
this.activityBinding.removeRequestPermissionsResultListener(this.delegate);
this.activityBinding = null;
if(this.observer != null) {
this.lifecycle.removeObserver(this.observer);
Expand Down
1 change: 1 addition & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ description: A package that allows you to use a native file explorer to pick sin
homepage: https://github.com/miguelpruivo/plugins_flutter_file_picker
repository: https://github.com/miguelpruivo/flutter_file_picker
issue_tracker: https://github.com/miguelpruivo/flutter_file_picker/issues

version: 8.1.2

dependencies:
Expand Down