diff --git a/android/build.gradle b/android/build.gradle index 48443cca5..6ad2e4316 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -18,9 +18,10 @@ android { abortOnError false } } - dependencies { implementation 'com.facebook.react:react-native:+' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' implementation 'com.github.yalantis:ucrop:2.2.6-native' + implementation 'androidx.activity:activity:1.9.2' + implementation "androidx.core:core:1.13.1" } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 0f5c93fa2..ffed3a254 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Tue May 17 14:28:43 CEST 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index 391f3037a..a08629b2c 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -25,6 +25,16 @@ + + + + + + + + + + diff --git a/android/src/main/java/com/reactnative/ivpusic/imagepicker/PickerModule.java b/android/src/main/java/com/reactnative/ivpusic/imagepicker/PickerModule.java index 00af623b8..c183fee6e 100644 --- a/android/src/main/java/com/reactnative/ivpusic/imagepicker/PickerModule.java +++ b/android/src/main/java/com/reactnative/ivpusic/imagepicker/PickerModule.java @@ -3,8 +3,8 @@ import android.Manifest; import android.app.Activity; import android.content.ClipData; -import android.content.Context; import android.content.ContentResolver; +import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; @@ -18,6 +18,8 @@ import android.util.Base64; import android.util.Log; import android.webkit.MimeTypeMap; +import androidx.activity.result.PickVisualMediaRequest; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.core.app.ActivityCompat; import androidx.core.content.FileProvider; @@ -41,8 +43,8 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -365,28 +367,32 @@ private void initiateCamera(Activity activity) { private void initiatePicker(final Activity activity) { try { - final Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT); + PickVisualMediaRequest.Builder builder = new PickVisualMediaRequest.Builder(); + PickVisualMediaRequest request = new PickVisualMediaRequest(); if (cropping || mediaType.equals("photo")) { - galleryIntent.setType("image/*"); + request = builder.setMediaType(new ActivityResultContracts.PickVisualMedia.SingleMimeType("image/*")).build(); + } + else{ if (cropping) { - String[] mimetypes = {"image/jpeg", "image/png"}; - galleryIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes); + request = builder.setMediaType(ActivityResultContracts.PickVisualMedia.ImageOnly.INSTANCE).build(); } - } else if (mediaType.equals("video")) { - galleryIntent.setType("video/*"); + else if (mediaType.equals("video")) { + request = builder.setMediaType(ActivityResultContracts.PickVisualMedia.VideoOnly.INSTANCE).build(); } else { - galleryIntent.setType("*/*"); - String[] mimetypes = {"image/*", "video/*"}; - galleryIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes); + request = builder.setMediaType(ActivityResultContracts.PickVisualMedia.ImageAndVideo.INSTANCE).build(); + } } - galleryIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - galleryIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, multiple); - galleryIntent.addCategory(Intent.CATEGORY_OPENABLE); + Intent intent; - final Intent chooserIntent = Intent.createChooser(galleryIntent, "Pick an image"); - activity.startActivityForResult(chooserIntent, IMAGE_PICKER_REQUEST); + if (multiple) { + intent = new ActivityResultContracts.PickMultipleVisualMedia().createIntent(activity, request); + } else { + intent = new ActivityResultContracts.PickVisualMedia().createIntent(activity, request); + } + + activity.startActivityForResult(intent, IMAGE_PICKER_REQUEST); } catch (Exception e) { resultCollector.notifyProblem(E_FAILED_TO_SHOW_PICKER, e); } @@ -801,7 +807,17 @@ private void imagePickerResult(Activity activity, final int requestCode, final i } else { Uri uri = data.getData(); + // if the result comes in clipData format (which apparently it does in some cases) if (uri == null) { + ClipData clipData = data.getClipData(); + if (clipData != null && clipData.getItemCount() > 0) { + ClipData.Item item = clipData.getItemAt(0); + uri = item.getUri(); + } + } + + // error out if uri is still null + if(uri == null) { resultCollector.notifyProblem(E_NO_IMAGE_DATA_FOUND, "Cannot resolve image url"); return; }