Как программно сделать снимок экрана с веб-просмотром, захватив всю страницу? - PullRequest
24 голосов
/ 17 марта 2012

Я думаю, что название в значительной степени охватывает его, но у меня есть веб-просмотр в моей деятельности.Я загрузил URL-адрес в веб-просмотр, и я хотел бы сделать снимок экрана полной страницы (что бы ни находилось в области просмотра, а также вещи «ниже сгиба»).код, который работает для создания снимка окна просмотра, и я знаю, что это можно сделать в 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);
    }

Но я все еще только захватываю только область просмотра.Не обращая внимания на такие вещи, как нехватка памяти из-за того, что страница слишком велика, кто-нибудь знает, что я делаю неправильно, или как я могу включить часть вне области просмотра?

Ответы [ 4 ]

25 голосов
/ 07 января 2013

Попробуйте это

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

}

Добавьте разрешение INTERNET и WRITE_EXTERNAL_STORAGE в файле AndroidManifest.xml.

Необходимо запросить разрешение во время выполнения для записи файла, если приложение запущено на или выше Marshmallow.

2 голосов
/ 14 марта 2015

@ avinash thakur коды действительно работают, вы просто забыли упомянуть, чтобы добавить <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> в файле манифеста Android, в противном случае Android не позволит вашему потоку записать данные / файл на устройство.

веселит.

1 голос
/ 15 мая 2019

webview.capturePicture () устарела, используйте нижеуказанный способ:

Bitmap bitmap = Bitmap.createBitmap(webview.getWidth(), webview.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
webview.draw(canvas);
return bitmap;
0 голосов
/ 15 февраля 2019

https://github.com/peter1492/LongScreenshot посмотрите, полезно ли это.получил код из некоторых ресурсов и библиотеки, сумел загрузить его на GitHub для использования.если он будет полезен, он будет опубликован, иначе он будет удален.

...