无法使用代码记录屏幕

时间:2014-08-09 04:49:53

标签: java android layout

所以我正在开发一个记录设备屏幕的应用程序。 我正在使用Runtime.getRuntime来执行命令。

所以我发现你可以使用adb shell screenrecord --bit-rate 8000000 --time-limit 15 /sdcard/demovideo.mp4通过adb录制设备屏幕,所以我这样做了。

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ImageButton time_launch = (ImageButton) findViewById(R.id.r_1);
        time_launch.setOnClickListener(new View.OnClickListener() { 

         @Override
         public void onClick(View v) {
             Process process = null;
            try {
                process = Runtime.getRuntime().exec("screenrecord --bit-rate 8000000 --time-limit 5 /sdcard/video.mp4");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
             BufferedReader bufferedReader = new BufferedReader(
             new InputStreamReader(process.getInputStream()));
            }
        });


}
}

但遗憾的是,当我按下按钮时,没有任何事情发生,视频根本没有录制。我尝试在互联网上四处寻找,但没有任何帮助。希望你们其中一个人可以帮助我。

1 个答案:

答案 0 :(得分:0)

尝试在屏幕录制命令之前运行“su”命令并查看它是否有效。如下所示:

             @Override
            public void onClick(View v) {
                 Process process = null;
                try {
                    Runtime.getRuntime().exec("su");
                    process = Runtime.getRuntime().exec("screenrecord   --bit-rate    8000000 --time-limit 5 /sdcard/video.mp4");
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                 BufferedReader bufferedReader = new BufferedReader(
                 new InputStreamReader(process.getInputStream()));
                }
            });

我在使用比特率选项时遇到了一些问题..运行没有比特率参数的命令 - 只提供路径参数process = Runtime.getRuntime().exec("screenrecord /sdcard/video.mp4"); ...

还要为您的应用清单添加WRITE_EXTERNAL_STORAGE权限。

这不适用于非root设备。

您还可以尝试以下操作:

使用反射从PhoneWindowManager.java调用takeScreenshot() 请参阅此处的以下代码,了解如何使用反射来调用隐藏的API。 为PhoneWindowManger做类似的事情。

TelephonyManager telephony = (TelephonyManager) 
  context.getSystemService(Context.TELEPHONY_SERVICE);  
  try {
      Log.v(TAG, "Get getTeleService...");
      Class c = Class.forName(telephony.getClass().getName());
      Method m = c.getDeclaredMethod("getITelephony");
      m.setAccessible(true);
      telephonyService = (ITelephony) m.invoke(telephony);
      telephonyService.silenceRinger();
      Log.v(TAG, "Answering Call now...");
      telephonyService.answerRingingCall();
      Log.v(TAG, "Call answered...");
      //telephonyService.endCall();
  } catch (Exception e) {
   e.printStackTrace();
   Log.e(TAG,
           "FATAL ERROR: could not connect to telephony subsystem");
   Log.e(TAG, "Exception object: " + e);
  }