web-dev-qa-db-ja.com

プログラムでWebViewのスクリーンショットを撮り、ページ全体をキャプチャするにはどうすればよいですか?

タイトルはそれをかなりカバーしていると思いますが、私の活動にはウェブビューがあります。 URLをWebビューにロードし、ページ全体のスクリーンショットを撮りたい(ビューポートにあるものと「スクロールせずに見える範囲」のものも同様)。

ビューポートのスナップショットに機能するコードを持っています。これは、スナップショットを作成する前にWebviewを拡大することでiOSで実行できることを知っています。ここで同じテクニックを使用しようとしました:

    WebView browserView = (WebView) findViewById(R.id.browserView);

    //Resize the webview to the height of the webpage
    int pageHeight = browserView.getContentHeight();
    LayoutParams browserParams = browserView.getLayoutParams();
    browserView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, pageHeight));

    //Capture the webview as a bitmap
    browserView.setDrawingCacheEnabled(true);
    Bitmap bitmap = Bitmap.createBitmap(browserView.getDrawingCache());
    browserView.setDrawingCacheEnabled(false);

    //Create the filename to use
    String randomFilenamepart = String.valueOf(new SecureRandom().nextInt(1000000));
    String filename = Environment.getExternalStorageDirectory().toString() + "/Screenshot_" + randomFilenamepart + ".jpg";
    File imageFile = new File(filename);
    //Stream the file out to external storage as a JPEG
    OutputStream fout = null;
    try {
        fout = new FileOutputStream(imageFile);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fout);
        fout.flush();
        fout.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        browserView.setLayoutParams(browserParams);
    }

しかし、私はまだビューポートだけをキャプチャしています。ページが大きすぎるためのメモリ不足などを無視して、誰かが私が間違っていることを知っているか、ビューポートの外側の部分をどのように含めることができますか?

26
Mark Rausch

これをお試しください

import Java.io.FileOutputStream;

import Android.app.Activity;
import Android.graphics.Bitmap;
import Android.graphics.Canvas;
import Android.graphics.Picture;
import Android.os.Bundle;
import Android.view.Menu;
import Android.webkit.WebView;
import Android.webkit.WebViewClient;

public class MainActivity extends Activity {

    WebView w;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        w = new WebView(this);
        w.setWebViewClient(new WebViewClient() {
            public void onPageFinished(WebView view, String url) {
                Picture picture = view.capturePicture();
                Bitmap b = Bitmap.createBitmap(picture.getWidth(),
                        picture.getHeight(), Bitmap.Config.ARGB_8888);
                Canvas c = new Canvas(b);

                picture.draw(c);
                FileOutputStream fos = null;
                try {

                    fos = new FileOutputStream("mnt/sdcard/yahoo.jpg");
                    if (fos != null) {
                        b.compress(Bitmap.CompressFormat.JPEG, 100, fos);

                        fos.close();
                    }
                } catch (Exception e) {

                }
            }
        });

        setContentView(w);
        w.loadUrl("http://search.yahoo.com/search?p=Android");
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

AndroidManifest.xmlファイルにINTERNET PERMISSIONおよびWRITE_EXTERNAL_STORAGEを追加します。

アプリがMarshmallow以上で実行されている場合は、実行時にファイルの書き込みを許可する必要があります。

25
avinash

@avinashタクルコードは実際に機能します。<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>をAndroidマニフェストファイルに追加することを忘れてしまいます。それ以外の場合、Androidストリームにデバイスにデータ/ファイルを書き込みます。

乾杯。

2
ralphgabb

webview.capturePicture()は非推奨です。以下の方法で実行できます。

Bitmap bitmap = Bitmap.createBitmap(webview.getWidth(), webview.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
webview.draw(canvas);
return bitmap;
1
Amos

https://github.com/peter1492/LongScreenshot 役立つかどうかを確認してください。いくつかのリソースとライブラリからコードを取得し、GitHubにアップロードして使用できるようにしました。有用な場合は公開したままにし、それ以外の場合は削除します。

0
Peter