This is how I did it, it is working for me:
package com.test.progress;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Picture;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final WebView mWeb = (WebView) findViewById(R.id.webView1);
// final WebView mWeb = new WebView(this);
final ImageView imgView = (ImageView) findViewById(R.id.imageView1);
mWeb.setInitialScale(100);
mWeb.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView v, String url) {
v.postDelayed(new Runnable() {
@Override
public void run() {
Picture picture = mWeb.capturePicture();
Bitmap bitmap = Bitmap.createBitmap(picture.getWidth(),
picture.getHeight(), Bitmap.Config.ARGB_8888);
final Canvas c = new Canvas(bitmap);
picture.draw(c);
imgView.setMinimumWidth(bitmap.getWidth());
imgView.setMinimumHeight(bitmap.getHeight());
imgView.setImageBitmap(bitmap);
imgView.setVisibility(View.VISIBLE);
}
}, 100);
}
});
mWeb.loadUrl("http://www.google.com");
}
}
xml layout:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/frage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<WebView
android:id="@+id/webView1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />
</LinearLayout>
Don't forget to add:
<uses-permission android:name="android.permission.INTERNET" />
UPDATE 1:
It seems WebView
must be visible to user to capture picture, here is a silly solution that is working perfectly.
NOTE: Never store bitmaps in memory like I am doing in the following sample. There are very good libraries available for caching purpose, use them.
package com.vj.test;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Picture;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends Activity {
ArrayAdapter<Data> mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GridView gv = (GridView) findViewById(R.id.gridView1);
final List<Data> data = new ArrayList<Data>();
try {
data.add(new Data(new URI("http://www.google.com")));
data.add(new Data(new URI("http://www.yahoo.com")));
data.add(new Data(new URI("http://www.facebook.com")));
data.add(new Data(new URI("http://www.google.com")));
data.add(new Data(new URI("http://www.google.com")));
data.add(new Data(new URI("http://www.google.com")));
} catch (Exception e) {
}
mAdapter = new ArrayAdapter<Data>(this, R.layout.cell, R.id.url, data) {
private Map<URI, Boolean> loadingUrls = new HashMap<URI, Boolean>();
private boolean loadingStarted = false;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(MainActivity.this)
.inflate(R.layout.cell, null);
}
Data d = getItem(position);
ImageView imageView = (ImageView) convertView
.findViewById(R.id.bitmap);
if (d.bm == null) {
convertView.findViewById(R.id.progress).setVisibility(
View.VISIBLE);
imageView.setImageBitmap(null);
loadBitmap(d);
} else {
imageView.setImageBitmap(d.bm);
convertView.findViewById(R.id.progress).setVisibility(
View.GONE);
}
TextView tv = (TextView) convertView.findViewById(R.id.url);
tv.setText(d.url.getHost() + "");
return convertView;
}
private void loadBitmap(final Data d) {
synchronized (loadingUrls) {
if (loadingUrls.containsKey(d.url)) {
return;
}
loadingUrls.put(d.url, false);
}
if (loadingStarted) {
return;
}
loadingStarted = true;
final WebView mWeb = (WebView) findViewById(R.id.laodingWebView);
mWeb.setDrawingCacheEnabled(true);
mWeb.setInitialScale(100);
mWeb.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView v, final String url) {
v.postDelayed(new Runnable() {
@Override
public void run() {
Picture picture = mWeb.capturePicture();
Bitmap bitmap = Bitmap.createBitmap(100, 100,
Bitmap.Config.ARGB_8888);
final Canvas c = new Canvas(bitmap);
picture.draw(c);
URI nextUrl = null;
// d.bm = bitmap;
synchronized (loadingUrls) {
loadingUrls.put((URI) mWeb.getTag(), true);
}
updateAllSimilar((URI) mWeb.getTag(), bitmap);
mAdapter.notifyDataSetChanged();
for (Entry<URI, Boolean> s : loadingUrls
.entrySet()) {
if (!s.getValue()) {
nextUrl = s.getKey();break;
}
}
if (nextUrl != null) {
loadNext(mWeb, nextUrl);
} else {
mWeb.setVisibility(View.GONE);
}
}
}, 50);
}
});
URI url = null;
for (Entry<URI, Boolean> s : loadingUrls.entrySet()) {
if (!s.getValue()) {
url = s.getKey();break;
}
}
if (url != null) {
loadNext(mWeb, url);
}
}
private void updateAllSimilar(URI url, Bitmap bm) {
synchronized (data) {
for (Data d : data) {
if (d.url.equals(url)) {
d.bm = bm;
}
}
}
}
private void loadNext(WebView mWeb, URI url) {
mWeb.loadUrl(url.toString());
mWeb.setTag(url);
}
};
gv.setAdapter(mAdapter);
}
static class Data {
Bitmap bm;// don't ever do this, Use cache libraries instead
URI url;
public Data(URI uri) {
this.url = uri;
}
}
}
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<GridView
android:id="@+id/gridView1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:numColumns="2" >
</GridView>
<WebView
android:id="@+id/laodingWebView"
android:layout_width="match_parent"
android:layout_height="1px" />
</LinearLayout>
cell.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/bitmap"
android:layout_width="match_parent"
android:layout_height="80dp"
android:scaleType="fitCenter" />
<TextView
android:id="@+id/url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:maxLines="1"
android:singleLine="true" />
</LinearLayout>
<ProgressBar
android:id="@+id/progress"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>