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の性能は少し悪く、数十ミリ秒の差があります.