@@ -638,24 +638,57 @@ public boolean onActivityResult(
638
638
return true ;
639
639
}
640
640
641
- private void handleChooseImageResult (int resultCode , Intent data ) {
642
- if (resultCode == Activity .RESULT_OK && data != null ) {
643
- Uri uri = data .getData ();
644
- // On several pre-Android 13 devices using Android Photo Picker, the Uri from getData() could be null.
645
- if (uri == null ) {
646
- ClipData clipData = data .getClipData ();
647
- if (clipData != null && clipData .getItemCount () == 1 ) {
648
- uri = clipData .getItemAt (0 ).getUri ();
641
+ @ Nullable
642
+ private ArrayList <MediaPath > getPathsFromIntent (@ NonNull Intent data , boolean includeMimeType ) {
643
+ ArrayList <MediaPath > paths = new ArrayList <>();
644
+
645
+ Uri uri = data .getData ();
646
+ // On several pre-Android 13 devices using Android Photo Picker, the Uri from getData() could
647
+ // be null.
648
+ if (uri == null ) {
649
+ ClipData clipData = data .getClipData ();
650
+
651
+ // If data.getData() and data.getClipData() are both null, we are in an error state. By
652
+ // convention we return null from here, and then finish with an error from the corresponding
653
+ // handler.
654
+ if (clipData == null ) {
655
+ return null ;
656
+ }
657
+
658
+ for (int i = 0 ; i < data .getClipData ().getItemCount (); i ++) {
659
+ uri = data .getClipData ().getItemAt (i ).getUri ();
660
+ // Same error state as above.
661
+ if (uri == null ) {
662
+ return null ;
663
+ }
664
+ String path = fileUtils .getPathFromUri (activity , uri );
665
+ // Again, same error state as above.
666
+ if (path == null ) {
667
+ return null ;
649
668
}
669
+ String mimeType = includeMimeType ? activity .getContentResolver ().getType (uri ) : null ;
670
+ paths .add (new MediaPath (path , mimeType ));
671
+ }
672
+ } else {
673
+ String path = fileUtils .getPathFromUri (activity , uri );
674
+ if (path == null ) {
675
+ return null ;
650
676
}
677
+ paths .add (new MediaPath (path , null ));
678
+ }
679
+ return paths ;
680
+ }
681
+
682
+ private void handleChooseImageResult (int resultCode , Intent data ) {
683
+ if (resultCode == Activity .RESULT_OK && data != null ) {
684
+ ArrayList <MediaPath > paths = getPathsFromIntent (data , false );
651
685
// If there's no valid Uri, return an error
652
- if (uri == null ) {
686
+ if (paths == null ) {
653
687
finishWithError ("no_valid_image_uri" , "Cannot find the selected image." );
654
688
return ;
655
689
}
656
690
657
- String path = fileUtils .getPathFromUri (activity , uri );
658
- handleImageResult (path , false );
691
+ handleMediaResult (paths );
659
692
return ;
660
693
}
661
694
@@ -683,20 +716,13 @@ public MediaPath(@NonNull String path, @Nullable String mimeType) {
683
716
684
717
private void handleChooseMediaResult (int resultCode , Intent intent ) {
685
718
if (resultCode == Activity .RESULT_OK && intent != null ) {
686
- ArrayList <MediaPath > paths = new ArrayList <>();
687
- if (intent .getClipData () != null ) {
688
- for (int i = 0 ; i < intent .getClipData ().getItemCount (); i ++) {
689
- Uri uri = intent .getClipData ().getItemAt (i ).getUri ();
690
- String path = fileUtils .getPathFromUri (activity , uri );
691
- String mimeType = activity .getContentResolver ().getType (uri );
692
- paths .add (new MediaPath (path , mimeType ));
693
- }
694
- } else {
695
- Uri uri = intent .getData ();
696
- if (uri != null ) {
697
- paths .add (new MediaPath (fileUtils .getPathFromUri (activity , uri ), null ));
698
- }
719
+ ArrayList <MediaPath > paths = getPathsFromIntent (intent , true );
720
+ // If there's no valid Uri, return an error
721
+ if (paths == null ) {
722
+ finishWithError ("no_valid_media_uri" , "Cannot find the selected media." );
723
+ return ;
699
724
}
725
+
700
726
handleMediaResult (paths );
701
727
return ;
702
728
}
@@ -707,17 +733,14 @@ private void handleChooseMediaResult(int resultCode, Intent intent) {
707
733
708
734
private void handleChooseMultiImageResult (int resultCode , Intent intent ) {
709
735
if (resultCode == Activity .RESULT_OK && intent != null ) {
710
- ArrayList <MediaPath > paths = new ArrayList <>();
711
- if (intent .getClipData () != null ) {
712
- for (int i = 0 ; i < intent .getClipData ().getItemCount (); i ++) {
713
- paths .add (
714
- new MediaPath (
715
- fileUtils .getPathFromUri (activity , intent .getClipData ().getItemAt (i ).getUri ()),
716
- null ));
717
- }
718
- } else {
719
- paths .add (new MediaPath (fileUtils .getPathFromUri (activity , intent .getData ()), null ));
736
+ ArrayList <MediaPath > paths = getPathsFromIntent (intent , false );
737
+ // If there's no valid Uri, return an error
738
+ if (paths == null ) {
739
+ finishWithError (
740
+ "missing_valid_image_uri" , "Cannot find at least one of the selected images." );
741
+ return ;
720
742
}
743
+
721
744
handleMediaResult (paths );
722
745
return ;
723
746
}
@@ -728,22 +751,14 @@ private void handleChooseMultiImageResult(int resultCode, Intent intent) {
728
751
729
752
private void handleChooseVideoResult (int resultCode , Intent data ) {
730
753
if (resultCode == Activity .RESULT_OK && data != null ) {
731
- Uri uri = data .getData ();
732
- // On several pre-Android 13 devices using Android Photo Picker, the Uri from getData() could be null.
733
- if (uri == null ) {
734
- ClipData clipData = data .getClipData ();
735
- if (clipData != null && clipData .getItemCount () == 1 ) {
736
- uri = clipData .getItemAt (0 ).getUri ();
737
- }
738
- }
754
+ ArrayList <MediaPath > paths = getPathsFromIntent (data , false );
739
755
// If there's no valid Uri, return an error
740
- if (uri == null ) {
756
+ if (paths == null || paths . size () < 1 ) {
741
757
finishWithError ("no_valid_video_uri" , "Cannot find the selected video." );
742
758
return ;
743
759
}
744
760
745
- String path = fileUtils .getPathFromUri (activity , uri );
746
- handleVideoResult (path );
761
+ finishWithSuccess (paths .get (0 ).path );
747
762
return ;
748
763
}
749
764
@@ -774,7 +789,7 @@ private void handleCaptureVideoResult(int resultCode) {
774
789
localPendingCameraMediaUrl != null
775
790
? localPendingCameraMediaUrl
776
791
: Uri .parse (cache .retrievePendingCameraMediaUriPath ()),
777
- this ::handleVideoResult );
792
+ this ::finishWithSuccess );
778
793
return ;
779
794
}
780
795
@@ -837,10 +852,6 @@ private void handleMediaResult(@NonNull ArrayList<MediaPath> paths) {
837
852
}
838
853
}
839
854
840
- private void handleVideoResult (String path ) {
841
- finishWithSuccess (path );
842
- }
843
-
844
855
private boolean setPendingOptionsAndResult (
845
856
@ Nullable ImageSelectionOptions imageOptions ,
846
857
@ Nullable VideoSelectionOptions videoOptions ,
0 commit comments