From 14a8e577d7c1730e9663c19381d6f3ed54c9b688 Mon Sep 17 00:00:00 2001 From: Kevin Leung Date: Fri, 13 Jan 2017 17:42:15 +0800 Subject: [PATCH 1/2] Support videos in Android CameraRoll.getPhotos --- .../modules/camera/CameraRollManager.java | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) 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 6216f10380d..7a9bcd794c5 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 @@ -32,6 +32,7 @@ import android.provider.MediaStore; import android.provider.MediaStore.Images; import android.text.TextUtils; +import android.util.Log; import com.facebook.common.logging.FLog; import com.facebook.react.bridge.GuardedAsyncTask; @@ -77,7 +78,8 @@ public class CameraRollManager extends ReactContextBaseJavaModule { Images.Media.WIDTH, Images.Media.HEIGHT, Images.Media.LONGITUDE, - Images.Media.LATITUDE + Images.Media.LATITUDE, + MediaStore.MediaColumns.DATA }; } else { PROJECTION = new String[] { @@ -86,7 +88,8 @@ public class CameraRollManager extends ReactContextBaseJavaModule { Images.Media.BUCKET_DISPLAY_NAME, Images.Media.DATE_TAKEN, Images.Media.LONGITUDE, - Images.Media.LATITUDE + Images.Media.LATITUDE, + MediaStore.MediaColumns.DATA }; } } @@ -226,6 +229,7 @@ public void getPhotos(final ReadableMap params, final Promise promise) { int first = params.getInt("first"); String after = params.hasKey("after") ? params.getString("after") : null; String groupName = params.hasKey("groupName") ? params.getString("groupName") : null; + String assetType = params.hasKey("assetType") ? params.getString("assetType") : "Photos"; ReadableArray mimeTypes = params.hasKey("mimeTypes") ? params.getArray("mimeTypes") : null; @@ -238,6 +242,7 @@ public void getPhotos(final ReadableMap params, final Promise promise) { first, after, groupName, + assetType, mimeTypes, promise) .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); @@ -248,6 +253,7 @@ private static class GetPhotosTask extends GuardedAsyncTask { private final int mFirst; private final @Nullable String mAfter; private final @Nullable String mGroupName; + private final @Nullable String mAssetType; private final @Nullable ReadableArray mMimeTypes; private final Promise mPromise; @@ -256,6 +262,7 @@ private GetPhotosTask( int first, @Nullable String after, @Nullable String groupName, + @Nullable String assetType, @Nullable ReadableArray mimeTypes, Promise promise) { super(context); @@ -263,6 +270,7 @@ private GetPhotosTask( mFirst = first; mAfter = after; mGroupName = groupName; + mAssetType = assetType; mMimeTypes = mimeTypes; mPromise = promise; } @@ -279,6 +287,19 @@ protected void doInBackgroundGuarded(Void... params) { selection.append(" AND " + SELECTION_BUCKET); selectionArgs.add(mGroupName); } + if (!TextUtils.isEmpty(mAssetType)) { + if(mAssetType.equals("Videos")) { + selection.append(" AND " + MediaStore.Files.FileColumns.MEDIA_TYPE + " = " + + MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO); + } else if(mAssetType.equals("Photos")) { + selection.append(" AND " + MediaStore.Files.FileColumns.MEDIA_TYPE + " = " + + MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE); + } else { + selection.append(" AND " + MediaStore.Files.FileColumns.MEDIA_TYPE + " IN (" + + MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO + "," + + MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE + ")"); + } + } if (mMimeTypes != null && mMimeTypes.size() > 0) { selection.append(" AND " + Images.Media.MIME_TYPE + " IN ("); for (int i = 0; i < mMimeTypes.size(); i++) { @@ -294,7 +315,7 @@ protected void doInBackgroundGuarded(Void... params) { // an SQLite DB and forwards parameters to it without doing any parsing / validation. try { Cursor photos = resolver.query( - Images.Media.EXTERNAL_CONTENT_URI, + MediaStore.Files.getContentUri("external"), PROJECTION, selection.toString(), selectionArgs.toArray(new String[selectionArgs.size()]), @@ -347,12 +368,13 @@ private static void putEdges( int heightIndex = IS_JELLY_BEAN_OR_LATER ? photos.getColumnIndex(Images.Media.HEIGHT) : -1; int longitudeIndex = photos.getColumnIndex(Images.Media.LONGITUDE); int latitudeIndex = photos.getColumnIndex(Images.Media.LATITUDE); + int dataIndex = photos.getColumnIndex(MediaStore.MediaColumns.DATA); for (int i = 0; i < limit && !photos.isAfterLast(); i++) { WritableMap edge = new WritableNativeMap(); WritableMap node = new WritableNativeMap(); boolean imageInfoSuccess = - putImageInfo(resolver, photos, node, idIndex, widthIndex, heightIndex); + putImageInfo(resolver, photos, node, idIndex, widthIndex, heightIndex, dataIndex); if (imageInfoSuccess) { putBasicNodeInfo(photos, node, mimeTypeIndex, groupNameIndex, dateTakenIndex); putLocationInfo(photos, node, longitudeIndex, latitudeIndex); @@ -386,11 +408,10 @@ private static boolean putImageInfo( WritableMap node, int idIndex, int widthIndex, - int heightIndex) { + int heightIndex, + int dataIndex) { WritableMap image = new WritableNativeMap(); - Uri photoUri = Uri.withAppendedPath( - Images.Media.EXTERNAL_CONTENT_URI, - photos.getString(idIndex)); + Uri photoUri = Uri.parse("file://" + photos.getString(dataIndex)); image.putString("uri", photoUri.toString()); float width = -1; float height = -1; From 16c6d1f4947760c5e22759aa538efb5126033af3 Mon Sep 17 00:00:00 2001 From: Kevin Leung Date: Fri, 13 Jan 2017 17:45:15 +0800 Subject: [PATCH 2/2] Remove unused import --- .../com/facebook/react/modules/camera/CameraRollManager.java | 1 - 1 file changed, 1 deletion(-) 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 7a9bcd794c5..5d24346a22f 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 @@ -32,7 +32,6 @@ import android.provider.MediaStore; import android.provider.MediaStore.Images; import android.text.TextUtils; -import android.util.Log; import com.facebook.common.logging.FLog; import com.facebook.react.bridge.GuardedAsyncTask;