注:本答案过时 - 我使用的最新Android版本是4.4,在其他未经测试的Android版本或设备上可能会有所不同...这也是一个超级复杂的黑客攻击 - 现在我建议使用web服务/API。
搞定了,我必须设置WebView的“大小”,以便生成的“屏幕截图”不是0 x 0大小。然后,我必须直接从WebView的绘图缓存中获取位图,因为capturePicture()
似乎在这里不起作用。
package com.example.screenshot;
import android.app.*;
import android.content.*;
import android.widget.*;
import android.util.*;
import android.webkit.*;
import android.graphics.*;
import java.io.*;
import android.view.View.*;
import android.os.*;
import android.os.Process;
public class ScreenshotService extends Service {
private Looper mServiceLooper;
private ServiceHandler mServiceHandler;
private Message msg;
private WebView webview;
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
webview = new WebView(ScreenshotService.this);
Toast.makeText(ScreenshotService.this, "Taking screenshot...", Toast.LENGTH_SHORT).show();
webview.setDrawingCacheEnabled(true);
webview.measure(600, 400);
webview.layout(0, 0, 600, 400);
webview.loadUrl("http://stackoverflow.com");
webview.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
}
@Override
public void onPageFinished(WebView view, String url) {
new takeScreenshotTask().execute();
stopSelf();
}
});
}
}
private class takeScreenshotTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void[] p1) {
synchronized (this) {try {wait(350);} catch (InterruptedException e) {}}
Bitmap b = webview.getDrawingCache();
File file = new File("/sdcard/example-screenshot.png");
OutputStream out;
try {
out = new BufferedOutputStream(new FileOutputStream(file));
b.compress(Bitmap.CompressFormat.PNG, 100, out);
out.close();
} catch (IOException e) {
Log.e("ScreenshotService", "IOException while trying to save thumbnail, Is /sdcard/ writable?");
e.printStackTrace();
}
Toast.makeText(ScreenshotService.this, "Screenshot taken", Toast.LENGTH_SHORT).show();
return null;
}
}
@Override
public void onCreate() {
HandlerThread thread = new HandlerThread("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
mServiceHandler.sendMessage(msg);
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
}
}
Intent intent = new Intent(this, SaveService.class); intent.putExtra(Intent.EXTRA_TEXT, "http://somewebsite.com/somepage");
。还要注意这里有一个更好/更新的版本的代码:https://github.com/JonasCz/save-for-offline/blob/master/app/src/main/java/jonas/tool/saveForOffline/ScreenshotService.java - Jonas Czech