No Description

RNThumbnailModule.java 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package com.reactlibrary;
  2. import com.facebook.react.bridge.ReactApplicationContext;
  3. import com.facebook.react.bridge.ReactContextBaseJavaModule;
  4. import com.facebook.react.bridge.ReactMethod;
  5. import com.facebook.react.bridge.Callback;
  6. import com.facebook.react.bridge.Promise;
  7. import com.facebook.react.bridge.Arguments;
  8. import com.facebook.react.bridge.WritableMap;
  9. import android.media.ThumbnailUtils;
  10. import android.provider.MediaStore;
  11. import android.provider.MediaStore.Video.Thumbnails;
  12. import android.graphics.Bitmap;
  13. import android.os.Environment;
  14. import android.util.Log;
  15. import android.media.MediaMetadataRetriever;
  16. import android.graphics.Matrix;
  17. import java.util.UUID;
  18. import java.io.File;
  19. import java.io.OutputStream;
  20. import java.io.FileOutputStream;
  21. public class RNThumbnailModule extends ReactContextBaseJavaModule {
  22. private final ReactApplicationContext reactContext;
  23. public RNThumbnailModule(ReactApplicationContext reactContext) {
  24. super(reactContext);
  25. this.reactContext = reactContext;
  26. }
  27. @Override
  28. public String getName() {
  29. return "RNThumbnail";
  30. }
  31. @ReactMethod
  32. public void get(String filePath, Promise promise) {
  33. filePath = filePath.replace("file://","");
  34. MediaMetadataRetriever retriever = new MediaMetadataRetriever();
  35. retriever.setDataSource(filePath);
  36. int videoWidth = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);
  37. int videoHeight = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);
  38. Bitmap image = retriever.getFrameAtTime(1000000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
  39. int bitmapWidth = image.getWidth();
  40. int bitmapHeight = image.getHeight();
  41. if ((bitmapWidth > bitmapHeight) !== (videoWidth > videoHeight)) {
  42. // we need to rotate image
  43. Matrix matrix = new Matrix();
  44. matrix.postRotate(-90);
  45. image = Bitmap.createBitmap(image, 0, 0, bitmapWidth, bitmapHeight, matrix, true);
  46. }
  47. String fullPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/thumb";
  48. try {
  49. File dir = new File(fullPath);
  50. if (!dir.exists()) {
  51. dir.mkdirs();
  52. }
  53. OutputStream fOut = null;
  54. // String fileName = "thumb-" + UUID.randomUUID().toString() + ".jpeg";
  55. String fileName = "thumb-" + UUID.randomUUID().toString() + ".jpeg";
  56. File file = new File(fullPath, fileName);
  57. file.createNewFile();
  58. fOut = new FileOutputStream(file);
  59. // 100 means no compression, the lower you go, the stronger the compression
  60. image.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
  61. fOut.flush();
  62. fOut.close();
  63. // MediaStore.Images.Media.insertImage(reactContext.getContentResolver(), file.getAbsolutePath(), file.getName(), file.getName());
  64. WritableMap map = Arguments.createMap();
  65. map.putString("path", "file://" + fullPath + '/' + fileName);
  66. map.putDouble("width", image.getWidth());
  67. map.putDouble("height", image.getHeight());
  68. promise.resolve(map);
  69. } catch (Exception e) {
  70. Log.e("E_RNThumnail_ERROR", e.getMessage());
  71. promise.reject("E_RNThumnail_ERROR", e);
  72. }
  73. }
  74. }