Java tutorial
/** * Copyright (C) 2012 30ideas (http://30ide.as) * MIT licensed * * @author Josemando Sobral * @created Jul 2nd, 2012. * improved by Hongbo LU */ package com.darktalker.cordova.screenshot; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.net.Uri; import android.os.Environment; import android.util.Base64; import android.view.TextureView; import android.view.View; import android.view.ViewGroup; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaPlugin; import org.apache.cordova.PluginResult; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class Screenshot extends CordovaPlugin { private CallbackContext mCallbackContext; private String mAction; private String mFormat; private String mFileName; private Integer mQuality; @Override public Object onMessage(String id, Object data) { if (id.equals("onGotXWalkBitmap")) { Bitmap bitmap = (Bitmap) data; if (bitmap != null) { if (mAction.equals("saveScreenshot")) { saveScreenshot(bitmap, mFormat, mFileName, mQuality); } else if (mAction.equals("getScreenshotAsURI")) { getScreenshotAsURI(bitmap, mQuality); } } } return null; } private Bitmap getBitmap() { Bitmap bitmap = null; boolean isCrosswalk = false; try { Class.forName("org.crosswalk.engine.XWalkWebViewEngine"); isCrosswalk = true; } catch (Exception e) { } if (isCrosswalk) { webView.getPluginManager().postMessage("captureXWalkBitmap", this); } else { View view = webView.getView();//.getRootView(); view.setDrawingCacheEnabled(true); bitmap = Bitmap.createBitmap(view.getDrawingCache()); view.setDrawingCacheEnabled(false); } return bitmap; } private void scanPhoto(String imageFileName) { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); File f = new File(imageFileName); Uri contentUri = Uri.fromFile(f); mediaScanIntent.setData(contentUri); this.cordova.getActivity().sendBroadcast(mediaScanIntent); } private void saveScreenshot(Bitmap bitmap, String format, String fileName, Integer quality) { try { File folder = new File(Environment.getExternalStorageDirectory(), "Pictures"); if (!folder.exists()) { folder.mkdirs(); } File f = new File(folder, fileName + "." + format); FileOutputStream fos = new FileOutputStream(f); if (format.equals("png")) { bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); } else if (format.equals("jpg")) { bitmap.compress(Bitmap.CompressFormat.JPEG, quality == null ? 100 : quality, fos); } JSONObject jsonRes = new JSONObject(); jsonRes.put("filePath", f.getAbsolutePath()); PluginResult result = new PluginResult(PluginResult.Status.OK, jsonRes); mCallbackContext.sendPluginResult(result); scanPhoto(f.getAbsolutePath()); fos.close(); } catch (JSONException e) { mCallbackContext.error(e.getMessage()); } catch (IOException e) { mCallbackContext.error(e.getMessage()); } } private void getScreenshotAsURI(Bitmap bitmap, int quality) { try { ByteArrayOutputStream jpeg_data = new ByteArrayOutputStream(); if (bitmap.compress(CompressFormat.JPEG, quality, jpeg_data)) { byte[] code = jpeg_data.toByteArray(); byte[] output = Base64.encode(code, Base64.NO_WRAP); String js_out = new String(output); js_out = "data:image/jpeg;base64," + js_out; JSONObject jsonRes = new JSONObject(); jsonRes.put("URI", js_out); PluginResult result = new PluginResult(PluginResult.Status.OK, jsonRes); mCallbackContext.sendPluginResult(result); js_out = null; output = null; code = null; } jpeg_data = null; } catch (JSONException e) { mCallbackContext.error(e.getMessage()); } catch (Exception e) { mCallbackContext.error(e.getMessage()); } } @Override public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException { // starting on ICS, some WebView methods // can only be called on UI threads mCallbackContext = callbackContext; mAction = action; if (action.equals("saveScreenshot")) { mFormat = (String) args.get(0); mQuality = (Integer) args.get(1); mFileName = (String) args.get(2); super.cordova.getActivity().runOnUiThread(new Runnable() { @Override public void run() { if (mFormat.equals("png") || mFormat.equals("jpg")) { Bitmap bitmap = getBitmap(); if (bitmap != null) { saveScreenshot(bitmap, mFormat, mFileName, mQuality); } } else { callbackContext.error("format " + mFormat + " not found"); } } }); return true; } else if (action.equals("getScreenshotAsURI")) { mQuality = (Integer) args.get(0); super.cordova.getActivity().runOnUiThread(new Runnable() { @Override public void run() { Bitmap bitmap = getBitmap(); if (bitmap != null) { getScreenshotAsURI(bitmap, mQuality); } } }); return true; } callbackContext.error("action not found"); return false; } }