2014-02-17 125 views
1

我想创建一个应用程序,它执行adb shell screenrecord命令的按钮单击。Java程序来执行adb外壳screenrecord

我已经试过Runtime.getRuntime().exec()方法,但没有奏效。我第一次尝试在模拟器上,但我知道模拟器不支持屏幕记录。请尽快让我知道一些解决方案。

在此先感谢..

回答

0

screenrecord需要GID =图形

调用Runtime.getRuntime()特别许可。EXEC()将只设置你的子进程的GID一样的你。所以你不能用这种方法记录屏幕。

可能的解决方案:

  1. 根您的手机,并获得一个root shell第一,然后告诉它执行screenrecord
  2. 开始与亚行壳后台服务进程,并使用你的应用程序来控制它
+0

嘿,我是新android开发,以便你能请张贴任何ADB shell命令的一个范例程序?提前致谢.. – Abhishek

0

这里有一个概念证明,可以轻松定制(时间,地点,比特率),以您的需求:

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线程分离,因此无论应用程序是否暂停,它都会记录。

尽管如此,系统可以在方便时将其关闭,所以最好的方法是控制服务的实际记录。