web-dev-qa-db-fra.com

Comment puis-je prendre par programme une capture d'écran d'une vue Web, en capturant la page complète?

Je pense que le titre couvre à peu près tout, mais j'ai une vision Web dans mon activité. J'ai chargé une URL dans la vue Web et j'aimerais prendre une capture d'écran de la page complète (tout ce qui se trouve dans la fenêtre et le contenu "au-dessous du pli" également).

J'ai un code qui fonctionne pour capturer la fenêtre, et je sais que cela peut être fait dans iOS en agrandissant la vue Web avant de la capturer. J'ai essayé d'utiliser la même technique ici:

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

Mais je ne capture que la fenêtre d'affichage. En négligeant des éléments tels que le manque de mémoire car la page est trop grande, est-ce que quelqu'un sait ce que je fais mal ou comment je peux inclure la partie en dehors de la fenêtre d'affichage?

23
Mark Rausch

Essaye celui-là 

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

}

Ajoutez INTERNET PERMISSION et WRITE_EXTERNAL_STORAGE dans le fichier AndroidManifest.xml.

Besoin de demander la permission au moment de l'exécution pour l'écriture de fichier si l'application est exécutée sur ou au-dessus de Marshmallow.

25
avinash

@avinash thakur codes fonctionne réellement, vous oubliez juste de mentionner d'ajouter <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/> au fichier manifeste d'Android, sinon, Android n'autorisera pas votre flux d'écrire des données/fichier sur l'appareil.

à votre santé. 

2
ralphgabb

https://github.com/peter1492/LongScreenshot regardez si c'est utile. obtenu le code de certaines ressources et de la bibliothèque, a réussi à le télécharger sur GitHub pour l’utiliser. si utile le gardera publié, il sera supprimé.

0
Peter