[英]java program to execute adb shell screenrecord
我想創建一個在單擊按鈕時執行adb shell screenrecord
命令的應用程序。
我已經嘗試過Runtime.getRuntime().exec()
方法,但是沒有用。 我最初是在模擬器上嘗試的,但是我了解到模擬器不支持屏幕記錄。 請盡快告訴我一些解決方案。
提前致謝..
屏幕記錄需要具有GID = graphics的特殊權限
Runtime.getRuntime()。exec()只會將子進程的GID設置為與您的相同。 因此,您無法使用這種方法記錄屏幕。
可能的解決方案:
這是一個概念證明,可以輕松地根據您的需求進行自定義(時間,位置,比特率):
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.