Ticker

6/recent/ticker-posts

Capture image generated by Google Charts API

Previous posts show how to "Display Google Charts (pie chart) on Android WebView" and "More Google Charts examples on Android WebView". To capture the PNG image of a chart, we can use the getImageURI() method, it return a string in "data:image/png;base64,..." format.


We can pass this string to Android code, decode and generate bitmap. To decode string in "data:image/png;base64,..." format, to Bitmap, we can use the code:
 private Bitmap decodeBase64PNG(String src){

String imageDataBytes = src.substring(src.indexOf(",") + 1);

InputStream stream =
new ByteArrayInputStream(
Base64.decode(imageDataBytes.getBytes(),
Base64.DEFAULT));

Bitmap bitmap = BitmapFactory.decodeStream(stream);
return bitmap;
}

For MainActivity.java, activity_main.xml and AndroidManifest.xml, refer to last post "Display Google Charts (pie chart) on Android WebView".

Other files modify from last post "More Google Charts examples on Android WebView".

Modify layout_webchart.xml to add a Button to Capture the image.

android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:autoLink="web"
android:text="http://picturedmagazine.blogspot.com/"
android:textStyle="bold" />

android:id="@+id/spcharts"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

android:id="@+id/capture"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Capture" />

android:id="@+id/web"
android:layout_width="match_parent"
android:layout_height="match_parent"/>



ShowWebChartActivity.java
package com.example.androidwebchart;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Base64;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.Toast;

@SuppressLint("SetJavaScriptEnabled")
public class ShowWebChartActivity extends ActionBarActivity {

WebView webView;
int num1, num2, num3, num4, num5;

Spinner spCharts;
List listCharts;
List listHtml;

Button btnCapture;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_webchart);

Intent intent = getIntent();
num1 = intent.getIntExtra("NUM1", 0);
num2 = intent.getIntExtra("NUM2", 0);
num3 = intent.getIntExtra("NUM3", 0);
num4 = intent.getIntExtra("NUM4", 0);
num5 = intent.getIntExtra("NUM5", 0);

spCharts = (Spinner) findViewById(R.id.spcharts);

listCharts = new ArrayList();
listCharts.add("Pie Chart");
listCharts.add("Pie Chart 3D");
listCharts.add("Scatter Chart");
listCharts.add("Column Chart");
listCharts.add("Bar Chart");
listCharts.add("Histogram");
listCharts.add("Line Chart");
listCharts.add("Area Chart");

listHtml = new ArrayList();
listHtml.add("file:///android_asset/pie_chart.html");
listHtml.add("file:///android_asset/pie_chart_3d.html");
listHtml.add("file:///android_asset/scatter_chart.html");
listHtml.add("file:///android_asset/column_chart.html");
listHtml.add("file:///android_asset/bar_chart.html");
listHtml.add("file:///android_asset/histogram.html");
listHtml.add("file:///android_asset/line_chart.html");
listHtml.add("file:///android_asset/area_chart.html");

ArrayAdapter dataAdapter = new ArrayAdapter(this,
android.R.layout.simple_spinner_item, listCharts);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spCharts.setAdapter(dataAdapter);
spCharts.setOnItemSelectedListener(new OnItemSelectedListener(){

@Override
public void onItemSelected(AdapterView parent, View view,
int position, long id) {
String chartHtml = listHtml.get(parent.getSelectedItemPosition());
webView.loadUrl(chartHtml);
}

@Override
public void onNothingSelected(AdapterView parent) {
// TODO Auto-generated method stub

}});

webView = (WebView)findViewById(R.id.web);
webView.addJavascriptInterface(new WebAppInterface(), "Android");

webView.getSettings().setJavaScriptEnabled(true);

btnCapture = (Button)findViewById(R.id.capture);
btnCapture.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v) {
//call Javascript in WebView/HTML
webView.loadUrl("javascript:capture()");
}});
}

private void showCaptured(String imageuri){

Bitmap bmp = decodeBase64PNG(imageuri);

Dialog dialog = new Dialog(this);
ImageView imageView = new ImageView(this);
imageView.setImageBitmap(bmp);
dialog.addContentView(
imageView,
new LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
dialog.show();

}

private Bitmap decodeBase64PNG(String src){

String imageDataBytes = src.substring(src.indexOf(",") + 1);

InputStream stream =
new ByteArrayInputStream(
Base64.decode(imageDataBytes.getBytes(),
Base64.DEFAULT));

Bitmap bitmap = BitmapFactory.decodeStream(stream);
return bitmap;
}

public class WebAppInterface {

@JavascriptInterface
public int getNum1() {
return num1;
}

@JavascriptInterface
public int getNum2() {
return num2;
}

@JavascriptInterface
public int getNum3() {
return num3;
}

@JavascriptInterface
public int getNum4() {
return num4;
}

@JavascriptInterface
public int getNum5() {
return num5;
}

@JavascriptInterface
public void captureCallback(String imageURI){
Toast.makeText(ShowWebChartActivity.this,
imageURI, Toast.LENGTH_LONG).show();
showCaptured(imageURI);
}
}

}

All other HTMLs:

  • add a method Javascript function capture() to be called from Android, and call chart.getImageURI() to get image, and pass back to Android by calling captureCallback().
  • Make chart to global by removing "var" in front of it.

pie_chart.html

















pie_chart_3d.html














scatter_chart.html














column_chart.html














bar_chart.html














histogram.html














line_chart.html














area_chart.html














download filesDownload the files.

إرسال تعليق

0 تعليقات