簡體   English   中英

執行ADB Shell ScreenRecord的Java程序

[英]java program to execute adb shell screenrecord

我想創建一個在單擊按鈕時執行adb shell screenrecord命令的應用程序。

我已經嘗試過Runtime.getRuntime().exec()方法,但是沒有用。 我最初是在模擬器上嘗試的,但是我了解到模擬器不支持屏幕記錄。 請盡快告訴我一些解決方案。

提前致謝..

屏幕記錄需要具有GID = graphics的特殊權限

Runtime.getRuntime()。exec()只會將子進程的GID設置為與您的相同。 因此,您無法使用這種方法記錄屏幕。

可能的解決方案:

  1. 為您的手機建立根,並首先獲得一個根外殼,然后告訴它執行screenrecord
  2. 使用adb shell啟動后台服務進程,並使用您的應用對其進行控制

這是一個概念證明,可以輕松地根據您的需求進行自定義(時間,位置,比特率):

private void record() {
  Log.d(getClass().getSimpleName(), "record()");

  final StringBuilder sbConsole = new StringBuilder();
  final StringBuilder sbErrors = new StringBuilder();

  AsyncTask<Void, Void, Void> recordTask = new AsyncTask<Void, Void, Void>() {
    @Override
    protected Void doInBackground(Void... objects) {
      Log.d(getClass().getSimpleName(), "recordTask.doInBackground()");

      DataOutputStream os = null;
      BufferedReader isReader = null;
      BufferedReader esReader = null;

      try {
        long start = System.currentTimeMillis();

        Process process = Runtime.getRuntime().exec("su");

        isReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        esReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));

        os = new DataOutputStream(process.getOutputStream());
        os.writeBytes("screenrecord --verbose --time-limit 10 --bit-rate 6000000 /sdcard/demo_6m.mp4\n");
        // os.writeBytes("exit\n");
        os.flush();

        String line;
        while ((line = esReader.readLine()) != null) {
          sbErrors.append(line);
        }
        while ((line = isReader.readLine()) != null) {
          sbConsole.append(line);
        }

        process.waitFor();

        long end = System.currentTimeMillis();
        Log.d(getClass().getSimpleName(), "recordTask.doInBackground(); elapsed: "
            + (end - start) + " ms");

      } catch (IOException e) {
        Log.e(getClass().getSimpleName(), "Exception: ", e);
      } catch (InterruptedException e) {
        Log.e(getClass().getSimpleName(), "Exception: ", e);
      }

      return null;
    }

    @Override
    protected void onPostExecute(Void result) {
      Log.i(getClass().getSimpleName(), "Output: " + sbConsole.toString());
      Log.e(getClass().getSimpleName(), "Errors: " + sbErrors.toString());
    }
  };

  recordTask.execute();

}

只需從onCreate()調用record()或通過單擊按鈕調用它即可。 由於AsyncTask是與應用程序用戶界面線程分離的,因此無論應用程序是否暫停,它都將進行記錄。

但是,系統可以在方便時將其殺死,因此最好的方法是控制服務中的實際記錄。

您需要成為Java中Process的超級用戶,請參見我的示例: https : //github.com/adouggy/MyRecorder

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM