Android:バックグラウンドサービスからWebページの「スクリーンショット」を撮りますか?

JonasCz

WebページのURLがあり、このWebページの「スクリーンショット」をバックグラウンドで撮りたいと考えています。サービス内で、ユーザーにUIを表示せずに

サービスでWebViewを作成しようとしましたがcapturePicture()、ページの読み込みが完了したときにこのメソッドを使用してスクリーンショットを取得しましたが、作成されたものPicture(およびBitmapそこから作成したもの)は常に空です。(これは通常のアクティビティでは完全に機能しますが、私のバックグラウンドサービスでは機能しません)。

これを機能させる方法、またはUIを使用せずにWebページの「スクリーンショット」を取得する別の方法はありますか?

JonasCz

注:この回答は古いです-私がこれを試した最新のAndroidバージョンは4.4、他のAndroidバージョンまたはこれをテストしなかったデバイスのYMMVです...これも非常に厄介なハックです-今日私はお勧めしますこのためにWebサービス/ APIを使用します。


それを理解したので、結果の「スクリーンショット」が0 x 0サイズにならないように、WebViewの「サイズ」を設定する必要があります。次にここでは機能していないように見えるため、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;

//this is an example of how to take a screenshot in a background service
//not very elegant, but it works (for me anyway)


public class ScreenshotService extends Service {
private Looper mServiceLooper;
private ServiceHandler mServiceHandler;
private Message msg;

private WebView webview;

// Handler that receives messages from the thread
private final class ServiceHandler extends Handler {
    public ServiceHandler(Looper looper) {
        super(looper);
    }
    @Override
    public void handleMessage(Message msg) {

        webview = new WebView(ScreenshotService.this);

        //without this toast message, screenshot will be blank, dont ask me why...
        Toast.makeText(ScreenshotService.this, "Taking screenshot...", Toast.LENGTH_SHORT).show();


        // This is the important code :)   
        webview.setDrawingCacheEnabled(true);

        //width x height of your webview and the resulting screenshot
        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) {
                    //without this method, your app may crash...
                }

                @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) {

        //allow the webview to render
        synchronized (this) {try {wait(350);} catch (InterruptedException e) {}}

        //here I save the bitmap to file
        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;
    }
}

//service related stuff below, its probably easyer to use intentService...

@Override
public void onCreate() {

    HandlerThread thread = new HandlerThread("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND);
    thread.start();

    // Get the HandlerThread's Looper and use it for our Handler 
    mServiceLooper = thread.getLooper();
    mServiceHandler = new ServiceHandler(mServiceLooper);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {


    // For each start request, send a message to start a job and deliver the
    // start ID so we know which request we're stopping when we finish the job
    msg = mServiceHandler.obtainMessage();
    msg.arg1 = startId;
    mServiceHandler.sendMessage(msg);

    // If we get killed, after returning from here, restart
    return START_STICKY;
}

@Override
public IBinder onBind(Intent intent) {
    // We don't provide binding, so return null
    return null;
}

@Override
public void onDestroy() {

}


}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

JavaScriptを使用してWebページのスクリーンショットを撮りますか?

分類Dev

スクリーンショットを撮る-バックグラウンドサービス

分類Dev

バックグラウンドのAndroidサービスからアプリケーション固有のモーションデータを取得する

分類Dev

Firefoxはいつホームページのウェブサイトのスクリーンショットを撮りますか?

分類Dev

Webサイトのすべてのページのスクリーンショットを撮る方法はありますか?

分類Dev

MediaProjection APIを使用して、バックグラウンドサービスクラスからスクリーンショットを取得する方法は?

分類Dev

セレンのアサーションのスクリーンショットを撮りますか?

分類Dev

ウェブサイトの信頼できるスクリーンショットを撮りますか?PhantomjsとCasperjsはどちらも、一部のWebサイトで空のスクリーンショットを返します

分類Dev

FFmpegは可変時間のビデオからスクリーンショットを撮ります

分類Dev

セレンウェブドライバーのスクリーンショットをページ全体にする方法はありますか?

分類Dev

バックグラウンドサービスからアプリケーションを開く

分類Dev

20,000ピクセルを超えるサイズのキャンバスからスクリーンショットを撮ります

分類Dev

バックグラウンドのリモートアクション可能な通知Webサービス呼び出しが機能していませんか?

分類Dev

xfce の領域のスクリーンショットを撮りますか?

分類Dev

ユーザーNSContactsの友達検索ページが非常に遅い+「このアプリケーションはバックグラウンドスレッドから自動レイアウトエンジンを変更しています」

分類Dev

TestCafeスクリーンショット:Android用ブラウザープロバイダー。Crop.js「ブラウザウィンドウのスクリーンショットでページ領域が見つかりません」

分類Dev

バックグラウンドサービスのフルスクリーンインテント通知Androidからアクティビティを開く方法

分類Dev

iOSは、アプリがバックグラウンドに送信されるたびにアプリのスクリーンショットを撮ります-アプリを保護するにはどうすればよいですか?

分類Dev

AndroidQ-バックグラウンドからフォアグラウンドロケーションサービスを開始します

分類Dev

JavaでWebページのスクリーンショットを撮る

分類Dev

WebページでAdobeFlashPlayerのスクリーンショットを撮る

分類Dev

セレンWebドライバーの特定のエラーページでスクリーンショットを撮る

分類Dev

アウトバーンサブスクリプションからのメッセージを非同期で非ブロッキングで処理します

分類Dev

セレンとChromeでページ全体のスクリーンショットを撮ります

分類Dev

ドロップダウンリストからオプションを選択すると、ページのスクロール位置が変わります

分類Dev

スクリーンショットを撮り、外部ストレージに保存してから共有する

分類Dev

ワークスペースチューザーをドラッグして、アプリケーションウィンドウをあるワークスペースから別のワークスペースに移動しますか?

分類Dev

表示されていないページの部分のスクリーンショットを撮ります

分類Dev

カピバラ:ロードされたページから画像を保存します(スクリーンショットではありません)

Related 関連記事

  1. 1

    JavaScriptを使用してWebページのスクリーンショットを撮りますか?

  2. 2

    スクリーンショットを撮る-バックグラウンドサービス

  3. 3

    バックグラウンドのAndroidサービスからアプリケーション固有のモーションデータを取得する

  4. 4

    Firefoxはいつホームページのウェブサイトのスクリーンショットを撮りますか?

  5. 5

    Webサイトのすべてのページのスクリーンショットを撮る方法はありますか?

  6. 6

    MediaProjection APIを使用して、バックグラウンドサービスクラスからスクリーンショットを取得する方法は?

  7. 7

    セレンのアサーションのスクリーンショットを撮りますか?

  8. 8

    ウェブサイトの信頼できるスクリーンショットを撮りますか?PhantomjsとCasperjsはどちらも、一部のWebサイトで空のスクリーンショットを返します

  9. 9

    FFmpegは可変時間のビデオからスクリーンショットを撮ります

  10. 10

    セレンウェブドライバーのスクリーンショットをページ全体にする方法はありますか?

  11. 11

    バックグラウンドサービスからアプリケーションを開く

  12. 12

    20,000ピクセルを超えるサイズのキャンバスからスクリーンショットを撮ります

  13. 13

    バックグラウンドのリモートアクション可能な通知Webサービス呼び出しが機能していませんか?

  14. 14

    xfce の領域のスクリーンショットを撮りますか?

  15. 15

    ユーザーNSContactsの友達検索ページが非常に遅い+「このアプリケーションはバックグラウンドスレッドから自動レイアウトエンジンを変更しています」

  16. 16

    TestCafeスクリーンショット:Android用ブラウザープロバイダー。Crop.js「ブラウザウィンドウのスクリーンショットでページ領域が見つかりません」

  17. 17

    バックグラウンドサービスのフルスクリーンインテント通知Androidからアクティビティを開く方法

  18. 18

    iOSは、アプリがバックグラウンドに送信されるたびにアプリのスクリーンショットを撮ります-アプリを保護するにはどうすればよいですか?

  19. 19

    AndroidQ-バックグラウンドからフォアグラウンドロケーションサービスを開始します

  20. 20

    JavaでWebページのスクリーンショットを撮る

  21. 21

    WebページでAdobeFlashPlayerのスクリーンショットを撮る

  22. 22

    セレンWebドライバーの特定のエラーページでスクリーンショットを撮る

  23. 23

    アウトバーンサブスクリプションからのメッセージを非同期で非ブロッキングで処理します

  24. 24

    セレンとChromeでページ全体のスクリーンショットを撮ります

  25. 25

    ドロップダウンリストからオプションを選択すると、ページのスクロール位置が変わります

  26. 26

    スクリーンショットを撮り、外部ストレージに保存してから共有する

  27. 27

    ワークスペースチューザーをドラッグして、アプリケーションウィンドウをあるワークスペースから別のワークスペースに移動しますか?

  28. 28

    表示されていないページの部分のスクリーンショットを撮ります

  29. 29

    カピバラ:ロードされたページから画像を保存します(スクリーンショットではありません)

ホットタグ

アーカイブ