我想创建一个应用程序,它执行adb shell screenrecord
命令的按钮单击。Java程序来执行adb外壳screenrecord
我已经试过Runtime.getRuntime().exec()
方法,但没有奏效。我第一次尝试在模拟器上,但我知道模拟器不支持屏幕记录。请尽快让我知道一些解决方案。
在此先感谢..
我想创建一个应用程序,它执行adb shell screenrecord
命令的按钮单击。Java程序来执行adb外壳screenrecord
我已经试过Runtime.getRuntime().exec()
方法,但没有奏效。我第一次尝试在模拟器上,但我知道模拟器不支持屏幕记录。请尽快让我知道一些解决方案。
在此先感谢..
screenrecord需要GID =图形
调用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与应用程序UI线程分离,因此无论应用程序是否暂停,它都会记录。
尽管如此,系统可以在方便时将其关闭,所以最好的方法是控制服务的实际记录。
你需要是在Java进程超级用户,看到我的例子: https://github.com/adouggy/MyRecorder
嘿,我是新android开发,以便你能请张贴任何ADB shell命令的一个范例程序?提前致谢.. – Abhishek