Skip to content

Commit b3b727e

Browse files
committed
add picke visual media api
1 parent 8deb964 commit b3b727e

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

src/android/ImagePicker.java

+35-6
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import android.net.Uri;
1414
import android.os.Build;
1515
import android.os.Bundle;
16+
import android.os.ext.SdkExtensions;
1617
import android.provider.MediaStore;
1718
import android.provider.OpenableColumns;
1819
import android.util.Log;
@@ -23,6 +24,8 @@
2324
import android.widget.ProgressBar;
2425
import android.widget.Toast;
2526

27+
import androidx.activity.result.PickVisualMediaRequest;
28+
import androidx.activity.result.contract.ActivityResultContracts;
2629
import androidx.core.content.ContextCompat;
2730

2831
import org.apache.cordova.CallbackContext;
@@ -64,12 +67,28 @@ public boolean execute(String action, final JSONArray args, final CallbackContex
6467
} else if (ACTION_GET_PICTURES.equals(action)) {
6568
final JSONObject params = args.getJSONObject(0);
6669
this.maxImageCount = params.has("maximumImagesCount") ? params.getInt("maximumImagesCount") : 20;
70+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) {
71+
int deviceMaxLimit = MediaStore.getPickImagesMaxLimit();
72+
if (this.maxImageCount > deviceMaxLimit) {
73+
this.maxImageCount = deviceMaxLimit;
74+
this.showMaxLimitWarning(deviceMaxLimit);
75+
};
76+
}
77+
78+
boolean useFilePicker = params.has("useFilePicker") && params.getBoolean("useFilePicker");
79+
80+
Intent imagePickerIntent = null;
81+
if (useFilePicker) {
82+
imagePickerIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
83+
imagePickerIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
84+
imagePickerIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
85+
} else {
86+
PickVisualMediaRequest pickVisualMediaRequest = new PickVisualMediaRequest.Builder().setMediaType(ActivityResultContracts.PickVisualMedia.ImageOnly.INSTANCE).build();
87+
imagePickerIntent = new ActivityResultContracts.PickMultipleVisualMedia(maxImageCount).createIntent(cordova.getContext(), pickVisualMediaRequest);
88+
}
6789

68-
Intent imagePickerIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
69-
imagePickerIntent.setType("image/*");
70-
imagePickerIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
7190
cordova.startActivityForResult(this, imagePickerIntent, SELECT_PICTURE);
72-
this.showMaxLimitWarning();
91+
this.showMaxLimitWarning(useFilePicker);
7392
return true;
7493
}
7594
return false;
@@ -266,8 +285,18 @@ private String copyFileToInternalStorage(Uri uri, String newDirName) {
266285
return output.getPath();
267286
}
268287

269-
private void showMaxLimitWarning() {
270-
String toastMsg = "Only the first " + this.maxImageCount + " images selected will be taken.";
288+
private void showMaxLimitWarning(boolean useFilePicker) {
289+
String toastMsg = "You can only select up to " + this.maxImageCount + " image(s)";
290+
if (useFilePicker) {
291+
toastMsg = "Only the first " + this.maxImageCount + " image(s) selected will be taken.";
292+
}
293+
(Toast.makeText(cordova.getContext(), toastMsg, Toast.LENGTH_LONG)).show();
294+
}
295+
private void showMaxLimitWarning(int deviceMaxLimit) {
296+
String toastMsg = "The maximumImagesCount:" + this.maxImageCount +
297+
"is greater than the device's max limit of images that can be selected from the MediaStore:" + deviceMaxLimit +
298+
". Maximum number of images that can be selected is:" + deviceMaxLimit;
299+
271300
(Toast.makeText(cordova.getContext(), toastMsg, Toast.LENGTH_LONG)).show();
272301
}
273302
}

www/imagepicker.js

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ ImagePicker.prototype.getPictures = function(success, fail, options) {
5959

6060
var params = {
6161
maximumImagesCount: options.maximumImagesCount ? options.maximumImagesCount : 15,
62+
useFilePicker: options.useFilePicker ? options.useFilePicker : false,
6263
width: options.width ? options.width : 0,
6364
height: options.height ? options.height : 0,
6465
quality: options.quality ? options.quality : 100,

0 commit comments

Comments
 (0)