Androidインタフェースのスクリーンショット(現在最も速い)
Androidインタフェースのスクリーンショットは珍しいことではありません.以前、本人もスクリーンショットに関するブログを書いたことがあります.当時のニーズは全体的なスクリーンショットで、それから特有のエリアに対して2回のスクリーンショットを行い、機能は実現しました.体験はあまりよくありません.周期が長すぎます.ユーザーは感じませんが、強迫症のプログラマーとして.より速い体験を追求するのに時間がかかります.
以前のスクリーンショットはanroid Apiを使用してスクリーンショットを呼び出していましたが、今回はadbを使用してスクリーンショットを行い、応答速度が大幅に向上しましたので、ダウンロードしてみてください.
まずインタフェースを書いて、周波数のデータをコールバックします.
最初のパラメータがtrueの場合、2番目のパラメータはピクチャのパスです.
最初のパラメータがfalseの場合、2番目のパラメータはエラー情報です.
public interface CaptureImageListener {
void getCaptureImagePath(boolean isSuucess, String imagePath);
}
public CaptureUtil(Context context) {
this.context = context;
}
public void captureScreen(CaptureImageListener listener) {
MyLog.update("=================== ==" + System.currentTimeMillis());
FileUtil.creatPathNotExcit();
String picPath = AppInfo.BASE_IMAGE + "/capture.png";
File dirFile = new File(picPath);
if (!dirFile.exists()) {
try {
dirFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
// root
Process su = Runtime.getRuntime().exec("su");
//
String strcmd = "/system/bin/screencap -p " + picPath;
strcmd = strcmd + "
exit
";
OutputStream os = su.getOutputStream();
os.write(strcmd.getBytes());
os.flush();
os.close();
if ((su.waitFor() != 0)) {
throw new SecurityException();
}
zipImagePath(picPath, listener);
} catch (Exception e) {
MyLog.update("=== ==" + e.getMessage());
TcpService.getInstance().isUpdateMirrorImage = false;
listener.getCaptureImagePath(false, "");
}
MyLog.update("=================== ==" + System.currentTimeMillis());
}
root権限を要求して、それからスクリーンショットを呼び出して、保存して、それからピクチャーの圧縮を行って、圧縮私はルバンの圧縮を使って、理解する必要があるのはここに行って見ることができます
ルバン圧縮ジャンプhttps://blog.csdn.net/fkgjdkblxckvbxbgb/article/details/79862343
以下、圧縮方法
private void zipImagePath(String savePath, final CaptureImageListener listner) {
MyLog.update("=================== ==" + System.currentTimeMillis());
File file = new File(savePath);
MyLog.update("==== ==" + file.length());
if (file.length() < (1024 * 100)) { // <400KB, ,
MyLog.update("=================== ==" + System.currentTimeMillis());
listner.getCaptureImagePath(true, savePath);
return;
}
Luban.with(context)
.load(savePath) //
.ignoreBy(100) //
.setTargetDir(AppInfo.BASE_CACHE) // ,
.setCompressListener(new OnCompressListener() { //
@Override
public void onStart() {
MyLog.update("======== =====");
}
@Override
public void onSuccess(String savePath) {
listner.getCaptureImagePath(true, savePath);
MyLog.update("=================== success==" + System.currentTimeMillis());
}
@Override
public void onError(Throwable e) {
TcpService.getInstance().isUpdateMirrorImage = false;
listner.getCaptureImagePath(false, e.toString());
MyLog.update("=================== failed==" + System.currentTimeMillis());
}
}).launch(); //
}
現在使用されている状態から見ると、これはまだ比較的速く、基本的に数ミリ秒で、周波数を遮断してすべての仕事を圧縮することができ、cpuの性能は少し悪く、数十ミリ秒の差があります.