バックグラウンドサービスを使用してスクリーンショットを撮ろうとしています。このサービスはFacebookのチャットヘッドのようなものですが、クリックしたときにスクリーンショットを撮ってほしいです。
私はいくつかのコードを開発しましたが、それは機能しません。私が最後に試したのは:
private void takeScreenshot() {
Date now = new Date();
Android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", now);
// image naming and path to include sd card appending name you choose for file
String mPath = Environment.getExternalStorageDirectory().toString() + "/capture/" + now + ".jpg";
// create bitmap screen capture
Bitmap bitmap;
View v1 = chatHead.getRootView();
v1.setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(v1.getDrawingCache());
v1.setDrawingCacheEnabled(false);
OutputStream fout = null;
File imageFile = new File(mPath);
try {
fout = new FileOutputStream(imageFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fout);
fout.flush();
fout.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
しかし、スクリーンショットを画面ではなくボタンに撮っています。
私は問題がここにあることを知っています:
View v1 = chatHead.getRootView();
しかし、私はそれを修正する方法がわかりません。誰か助けてもらえますか?
私は実際にAndroid Studio2.2.2およびAndroid 4.0以降を使用しています。
Lollipop以上の場合、Googleの MediaProjection APIを使用してスクリーンショットを撮ることができますが、ユーザーに許可を求める必要があります。
MediaProjectionを使用してサンプルのスクリーンキャプチャコードを見つけることができます ここ
Lollipop未満のデバイスの場合は、root権限が必要です。
アプリに属していないビューを含むスクリーンショットを取得するには、MediaProjectionManager
を使用する必要があります。
Androidアプリケーション? のステータスバーの内容を含むスクリーンショットを撮る方法
使用する MediaProjectionManager#createScreenCaptureIntent
AndroidのMediaProjection
APIで提供されます。現在行っているのは、上部のステータスバーを含むデバイスの全画面に表示される情報ではなく、chatHeadのルートビューの情報を取得することです。