Skip to content

Commit e9e572b

Browse files
PauligrinderPauli Kettunen
andauthored
Implement the new official Android Photo Picker (#2093)
* Test implementation for new Android Photo Picker SDK * Add fix for when a single image is returned as clipData --------- Co-authored-by: Pauli Kettunen <[email protected]>
1 parent 174f609 commit e9e572b

File tree

4 files changed

+45
-19
lines changed

4 files changed

+45
-19
lines changed

android/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ android {
1818
abortOnError false
1919
}
2020
}
21-
2221
dependencies {
2322
implementation 'com.facebook.react:react-native:+'
2423
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
2524
implementation 'com.github.yalantis:ucrop:2.2.6-native'
25+
implementation 'androidx.activity:activity:1.9.2'
26+
implementation "androidx.core:core:1.13.1"
2627
}
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
#Tue May 17 14:28:43 CEST 2016
21
distributionBase=GRADLE_USER_HOME
32
distributionPath=wrapper/dists
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip

android/src/main/AndroidManifest.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,16 @@
2525
<activity
2626
android:name="com.yalantis.ucrop.UCropActivity"
2727
android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
28+
29+
30+
<!-- Prompt Google Play services to install the backported photo picker module -->
31+
<service android:name="com.google.android.gms.metadata.ModuleDependencies" android:enabled="false" android:exported="false">
32+
<intent-filter>
33+
<action android:name="com.google.android.gms.metadata.MODULE_DEPENDENCIES" />
34+
</intent-filter>
35+
36+
<meta-data android:name="photopicker_activity:0:required" android:value="" />
37+
</service>
2838
</application>
2939

3040
</manifest>

android/src/main/java/com/reactnative/ivpusic/imagepicker/PickerModule.java

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import android.Manifest;
44
import android.app.Activity;
55
import android.content.ClipData;
6-
import android.content.Context;
76
import android.content.ContentResolver;
7+
import android.content.Context;
88
import android.content.Intent;
99
import android.content.pm.PackageManager;
1010
import android.graphics.Bitmap;
@@ -18,6 +18,8 @@
1818
import android.util.Base64;
1919
import android.util.Log;
2020
import android.webkit.MimeTypeMap;
21+
import androidx.activity.result.PickVisualMediaRequest;
22+
import androidx.activity.result.contract.ActivityResultContracts;
2123

2224
import androidx.core.app.ActivityCompat;
2325
import androidx.core.content.FileProvider;
@@ -41,8 +43,8 @@
4143
import java.io.ByteArrayOutputStream;
4244
import java.io.File;
4345
import java.io.FileInputStream;
44-
import java.io.FileOutputStream;
4546
import java.io.FileNotFoundException;
47+
import java.io.FileOutputStream;
4648
import java.io.IOException;
4749
import java.io.InputStream;
4850
import java.io.OutputStream;
@@ -365,28 +367,32 @@ private void initiateCamera(Activity activity) {
365367

366368
private void initiatePicker(final Activity activity) {
367369
try {
368-
final Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT);
370+
PickVisualMediaRequest.Builder builder = new PickVisualMediaRequest.Builder();
371+
PickVisualMediaRequest request = new PickVisualMediaRequest();
369372

370373
if (cropping || mediaType.equals("photo")) {
371-
galleryIntent.setType("image/*");
374+
request = builder.setMediaType(new ActivityResultContracts.PickVisualMedia.SingleMimeType("image/*")).build();
375+
}
376+
else{
372377
if (cropping) {
373-
String[] mimetypes = {"image/jpeg", "image/png"};
374-
galleryIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
378+
request = builder.setMediaType(ActivityResultContracts.PickVisualMedia.ImageOnly.INSTANCE).build();
375379
}
376-
} else if (mediaType.equals("video")) {
377-
galleryIntent.setType("video/*");
380+
else if (mediaType.equals("video")) {
381+
request = builder.setMediaType(ActivityResultContracts.PickVisualMedia.VideoOnly.INSTANCE).build();
378382
} else {
379-
galleryIntent.setType("*/*");
380-
String[] mimetypes = {"image/*", "video/*"};
381-
galleryIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
383+
request = builder.setMediaType(ActivityResultContracts.PickVisualMedia.ImageAndVideo.INSTANCE).build();
384+
}
382385
}
383386

384-
galleryIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
385-
galleryIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, multiple);
386-
galleryIntent.addCategory(Intent.CATEGORY_OPENABLE);
387+
Intent intent;
387388

388-
final Intent chooserIntent = Intent.createChooser(galleryIntent, "Pick an image");
389-
activity.startActivityForResult(chooserIntent, IMAGE_PICKER_REQUEST);
389+
if (multiple) {
390+
intent = new ActivityResultContracts.PickMultipleVisualMedia().createIntent(activity, request);
391+
} else {
392+
intent = new ActivityResultContracts.PickVisualMedia().createIntent(activity, request);
393+
}
394+
395+
activity.startActivityForResult(intent, IMAGE_PICKER_REQUEST);
390396
} catch (Exception e) {
391397
resultCollector.notifyProblem(E_FAILED_TO_SHOW_PICKER, e);
392398
}
@@ -801,7 +807,17 @@ private void imagePickerResult(Activity activity, final int requestCode, final i
801807
} else {
802808
Uri uri = data.getData();
803809

810+
// if the result comes in clipData format (which apparently it does in some cases)
804811
if (uri == null) {
812+
ClipData clipData = data.getClipData();
813+
if (clipData != null && clipData.getItemCount() > 0) {
814+
ClipData.Item item = clipData.getItemAt(0);
815+
uri = item.getUri();
816+
}
817+
}
818+
819+
// error out if uri is still null
820+
if(uri == null) {
805821
resultCollector.notifyProblem(E_NO_IMAGE_DATA_FOUND, "Cannot resolve image url");
806822
return;
807823
}

0 commit comments

Comments
 (0)