From 0add94047a5a3addfcdfa615622d66f90621b29a Mon Sep 17 00:00:00 2001 From: dmcBig Date: Wed, 15 Nov 2017 17:35:05 +0800 Subject: [PATCH] add extractThumbnail takePhoto --- src/android/MediaPicker.java | 156 +++++++++++++++++++++++++++-------- 1 file changed, 121 insertions(+), 35 deletions(-) diff --git a/src/android/MediaPicker.java b/src/android/MediaPicker.java index 470464d..d933736 100644 --- a/src/android/MediaPicker.java +++ b/src/android/MediaPicker.java @@ -1,5 +1,6 @@ -package com.dmc.mediaPicker; +package com.dmc.mediaPickerPlugin; +import android.app.ProgressDialog; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -29,14 +30,19 @@ import java.util.ArrayList; * This class echoes a string called from JavaScript. */ public class MediaPicker extends CordovaPlugin { - - private CallbackContext callback; - private boolean showBase64=false; private boolean showThumbnail=false; + private boolean showProgressDialog=true; + private int quality=50; + private int thumbnailW=120; + private int thumbnailH=120; + private ProgressDialog dialog; + private String progressDialogStr=""; @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { + getPublicArgs(args); + if (action.equals("getMedias")) { this.getMedias(args, callbackContext); return true; @@ -46,6 +52,9 @@ public class MediaPicker extends CordovaPlugin { }else if(action.equals("photoLibrary")){ this.getMedias(args, callbackContext); return true; + }else if(action.equals("extractThumbnail")){ + this.extractThumbnail(args, callbackContext); + return true; } return false; } @@ -67,16 +76,6 @@ public class MediaPicker extends CordovaPlugin { } catch (Exception e) { e.printStackTrace(); } - try { - showBase64=jsonObject.getBoolean("showBase64"); - } catch (Exception e) { - e.printStackTrace(); - } - try { - showThumbnail=jsonObject.getBoolean("showThumbnail"); - } catch (Exception e) { - e.printStackTrace(); - } try { intent.putExtra(PickerConfig.SELECT_MODE,jsonObject.getInt("selectMode"));//default image and video (Optional) } catch (Exception e) { @@ -106,47 +105,134 @@ public class MediaPicker extends CordovaPlugin { this.cordova.startActivityForResult(this,intent,200); } + public void getPublicArgs(JSONArray args){ + JSONObject jsonObject=new JSONObject(); + if (args != null && args.length() > 0) { + try { + jsonObject = args.getJSONObject(0); + } catch (Exception e) { + e.printStackTrace(); + } + try { + showBase64 = jsonObject.getBoolean("showBase64"); + } catch (Exception e) { + e.printStackTrace(); + } + try { + showThumbnail = jsonObject.getBoolean("showThumbnail"); + } catch (Exception e) { + e.printStackTrace(); + } + try { + progressDialogStr = jsonObject.getString("progressDialogStr"); + } catch (Exception e) { + e.printStackTrace(); + } + try { + quality = jsonObject.getInt("thumbnailQuality"); + } catch (Exception e) { + e.printStackTrace(); + } + try { + thumbnailW = jsonObject.getInt("thumbnailW"); + } catch (Exception e) { + e.printStackTrace(); + } + try { + thumbnailH = jsonObject.getInt("thumbnailH"); + } catch (Exception e) { + e.printStackTrace(); + } + try { + showProgressDialog = jsonObject.getBoolean("showProgressDialog"); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); try { if(requestCode==200&&resultCode==PickerConfig.RESULT_CODE){ - ArrayList select=intent.getParcelableArrayListExtra(PickerConfig.EXTRA_RESULT); - JSONArray jsonArray=new JSONArray(); - for(Media media:select){ - String path=media.path; - JSONObject object=new JSONObject(); - if(showThumbnail){ - object.put("thumbnailBase64",thumbToBase64(path,media.mediaType)); - } - object.put("path",path); - object.put("size",media.size); - object.put("uri",Uri.parse(path)); - object.put("exifRotate",getBitmapRotate(path)); - object.put("mediaType",media.mediaType==3?"video":"image"); - jsonArray.put(object); + final ArrayList select=intent.getParcelableArrayListExtra(PickerConfig.EXTRA_RESULT); + final JSONArray jsonArray=new JSONArray(); + if(showProgressDialog) { + dialog = ProgressDialog.show(cordova.getActivity(), "", progressDialogStr, false, true); } - this.callback.success(jsonArray); - + cordova.getThreadPool().execute(new Runnable() { + public void run() { + try { + for(Media media:select){ + String path=media.path; + JSONObject object=new JSONObject(); + if(showThumbnail){ + object.put("thumbnailBase64",extractThumbnail(path,media.mediaType)); + } + object.put("path",path); + object.put("size",media.size); + object.put("uri",Uri.parse(path)); + object.put("exifRotate",getBitmapRotate(path)); + object.put("name",media.name); + object.put("mediaType",media.mediaType==3?"video":"image"); + jsonArray.put(object); + } + MediaPicker.this.callback.success(jsonArray); + if(showProgressDialog) { + dialog.dismiss(); + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + }); } } catch (Exception e) { e.printStackTrace(); } } - public String thumbToBase64(String path,int mediaType) { + public void extractThumbnail(JSONArray args, CallbackContext callbackContext){ + JSONObject jsonObject=new JSONObject(); + if (args != null && args.length() > 0) { + try { + jsonObject = args.getJSONObject(0); + } catch (Exception e) { + e.printStackTrace(); + } + String uri= null; + int mediatype= 1; + try { + uri = jsonObject.getString("uri"); + mediatype = "video".equals(jsonObject.getString("mediaType"))?3:1; + } catch (JSONException e) { + e.printStackTrace(); + } + callbackContext.success(extractThumbnail(uri,mediatype)); + } + + } + + public String extractThumbnail(String path,int mediaType) { + String encodedImage = null; + try { Bitmap thumbImage; if (mediaType == 3) { thumbImage = ThumbnailUtils.createVideoThumbnail(path, MediaStore.Images.Thumbnails.MICRO_KIND); } else { - thumbImage = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(path), 150, 150); + thumbImage = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(path), thumbnailW, thumbnailH); } ByteArrayOutputStream baos = new ByteArrayOutputStream(); - thumbImage.compress(Bitmap.CompressFormat.JPEG, 100, baos); + thumbImage.compress(Bitmap.CompressFormat.JPEG, quality, baos); byte[] imageBytes = baos.toByteArray(); - String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT); - return encodedImage; + encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT); + baos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return encodedImage; } public static String fileToBase64(String path,int mediaType) {