Java tutorial
/** * Copyright (C) 2012 30ideas (http://30ide.as) * MIT licensed * * @author Josemando Sobral * @created Jul 2nd, 2012. * improved by Hongbo LU * changed 2016-09-02 by Tim Perry to remove save feature -- try to avoid prompting user for access to files * when all I want is a screenshot of the current app. */ package com.sharerevolution.cordova.screenshot; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; 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 JSONArray mArgs; 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("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 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()); } } public void getScreenshotAsURI() throws JSONException { mQuality = (Integer) mArgs.get(0); super.cordova.getActivity().runOnUiThread(new Runnable() { @Override public void run() { Bitmap bitmap = getBitmap(); if (bitmap != null) { getScreenshotAsURI(bitmap, mQuality); } } }); } @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; mArgs = args; if (action.equals("getScreenshotAsURI")) { getScreenshotAsURI(); return true; } callbackContext.error("action not found"); return false; } }