diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/camera/CameraRollManager.java b/ReactAndroid/src/main/java/com/facebook/react/modules/camera/CameraRollManager.java index 05746f4f508f7d..7220d67a96b952 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/camera/CameraRollManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/camera/CameraRollManager.java @@ -16,6 +16,7 @@ import android.media.MediaScannerConnection; import android.net.Uri; import android.os.AsyncTask; +import android.os.Build; import android.os.Environment; import android.provider.MediaStore; import android.provider.MediaStore.Images; @@ -47,6 +48,7 @@ import java.nio.channels.FileChannel; import java.nio.channels.ReadableByteChannel; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; // TODO #6015104: rename to something less iOSish @@ -68,22 +70,33 @@ public class CameraRollManager extends NativeCameraRollManagerSpec { private static final String ASSET_TYPE_VIDEOS = "Videos"; private static final String ASSET_TYPE_ALL = "All"; - private static final String[] PROJECTION = { - Images.Media._ID, - Images.Media.MIME_TYPE, - Images.Media.BUCKET_DISPLAY_NAME, - Images.Media.DATE_TAKEN, - MediaStore.MediaColumns.WIDTH, - MediaStore.MediaColumns.HEIGHT, - Images.Media.LONGITUDE, - Images.Media.LATITUDE, - MediaStore.MediaColumns.DATA - }; - private static final String SELECTION_BUCKET = Images.Media.BUCKET_DISPLAY_NAME + " = ?"; private static final String SELECTION_DATE_TAKEN = Images.Media.DATE_TAKEN + " < ?"; private static final String SELECTION_MEDIA_SIZE = Images.Media.SIZE + " < ?"; + private static final int IMAGES_MEDIA_LATITUDE_LONGITUDE_DEPRECATED_API_LEVEL = 29; + private static final String[] PROJECTION_LIST; + + static { + ArrayList projection_list = + new ArrayList<>( + Arrays.asList( + Images.Media._ID, + Images.Media.MIME_TYPE, + Images.Media.BUCKET_DISPLAY_NAME, + Images.Media.DATE_TAKEN, + MediaStore.MediaColumns.WIDTH, + MediaStore.MediaColumns.HEIGHT, + MediaStore.MediaColumns.DATA)); + if (Build.VERSION.SDK_INT < IMAGES_MEDIA_LATITUDE_LONGITUDE_DEPRECATED_API_LEVEL) { + projection_list.add(Images.Media.LATITUDE); + projection_list.add(Images.Media.LONGITUDE); + PROJECTION_LIST = projection_list.toArray(new String[0]); + } else { + PROJECTION_LIST = projection_list.toArray(new String[0]); + } + } + public CameraRollManager(ReactApplicationContext reactContext) { super(reactContext); } @@ -351,7 +364,7 @@ protected void doInBackgroundGuarded(Void... params) { Cursor media = resolver.query( MediaStore.Files.getContentUri("external"), - PROJECTION, + PROJECTION_LIST, selection.toString(), selectionArgs.toArray(new String[selectionArgs.size()]), Images.Media.DATE_TAKEN @@ -413,7 +426,9 @@ private static void putEdges( resolver, media, node, idIndex, widthIndex, heightIndex, dataIndex, mimeTypeIndex); if (imageInfoSuccess) { putBasicNodeInfo(media, node, mimeTypeIndex, groupNameIndex, dateTakenIndex); - putLocationInfo(media, node, longitudeIndex, latitudeIndex); + if (Build.VERSION.SDK_INT < IMAGES_MEDIA_LATITUDE_LONGITUDE_DEPRECATED_API_LEVEL) { + putLocationInfo(media, node, longitudeIndex, latitudeIndex); + } edge.putMap("node", node); edges.pushMap(edge);