com.darktalker.cordova.screenshot.Screenshot.java Source code

Java tutorial

Introduction

Here is the source code for com.darktalker.cordova.screenshot.Screenshot.java

Source

/**
 * 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 java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

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 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;

public class Screenshot extends CordovaPlugin {

    private TextureView findXWalkTextureView(ViewGroup group) {

        int childCount = group.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = group.getChildAt(i);
            if (child instanceof TextureView) {
                String parentClassName = child.getParent().getClass().toString();
                boolean isRightKindOfParent = (parentClassName.contains("XWalk"));
                if (isRightKindOfParent) {
                    return (TextureView) child;
                }
            } else if (child instanceof ViewGroup) {
                TextureView textureView = findXWalkTextureView((ViewGroup) child);
                if (textureView != null) {
                    return textureView;
                }
            }
        }

        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) {
            try {

                TextureView textureView = findXWalkTextureView((ViewGroup) webView.getView());
                if (textureView != null) {
                    bitmap = textureView.getBitmap();
                    return bitmap;
                }
            } catch (Exception e) {
            }
        }

        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);
    }

    @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

        if (action.equals("saveScreenshot")) {
            final String format = (String) args.get(0);
            final Integer quality = (Integer) args.get(1);
            final String fileName = (String) args.get(2);

            super.cordova.getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {

                    try {
                        if (format.equals("png") || format.equals("jpg")) {
                            Bitmap bitmap = getBitmap();
                            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);
                            }
                            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);
                            callbackContext.sendPluginResult(result);

                            scanPhoto(f.getAbsolutePath());
                        } else {
                            callbackContext.error("format " + format + " not found");

                        }

                    } catch (JSONException e) {
                        callbackContext.error(e.getMessage());

                    } catch (IOException e) {
                        callbackContext.error(e.getMessage());

                    }
                }
            });
            return true;
        } else if (action.equals("getScreenshotAsURI")) {
            final Integer quality = (Integer) args.get(0);

            super.cordova.getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Bitmap bitmap = getBitmap();

                        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);
                            callbackContext.sendPluginResult(result);

                            js_out = null;
                            output = null;
                            code = null;
                        }

                        jpeg_data = null;

                    } catch (JSONException e) {
                        callbackContext.error(e.getMessage());

                    } catch (Exception e) {
                        callbackContext.error(e.getMessage());

                    }
                }
            });

            return true;
        }
        callbackContext.error("action not found");
        return false;
    }
}