【问题标题】:Cannot record screen using code无法使用代码录制屏幕
【发布时间】:2014-08-10 13:16:12
【问题描述】:

所以我正在开发一个可以记录设备屏幕的应用程序。 我正在使用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()));
            }
        });


}
}

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

【问题讨论】:

  • 你应该有root权限和Android 4.4+才能录制。
  • 将 su 添加到命令行,但仍然没有任何反应。
  • 确实,这在安全模型保持不变的设备上是不允许的。
  • 所以不可能通过应用程序做到这一点?还是我需要研究另一种方法?

标签: java android layout


【解决方案1】:

尝试在录屏命令之前运行“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);
  }

【讨论】:

  • 在致电 su.您会弹出一个请求权限的窗口。但在那之后。 (5 秒周期)。什么都不记录?我只是想知道其他应用如何实现这一目标?
  • @robin 我在使用比特率选项时看到了一些问题..尝试在没有比特率参数的情况下运行命令 - 只提供路径参数 `process = Runtime.getRuntime().exec("screenrecord /sdcard/ video.mp4");还要确保您提供的文件路径是正确的。让我们知道这是否有效。还将 WRITE_EXTERNAL_STORAGE 权限添加到您的应用清单。
  • 它有效,我进入我的 sdcard 并显示 video.mp4 但文件大小为 00.00kb 并且无法播放。我还运行了这个代码 process = Runtime.getRuntime().exec("screenrecord --time-limit 15 /sdcard/video.mp4");因为我不知道如何停止录制,所以我添加了时间限制
  • 要停止录制,您可以在特定时间间隔后模拟 Ctrl+C。如果现在可以使用,请参考-stackoverflow.com/questions/2886756/…...
  • @Robin 还检查从命令提示符运行屏幕记录是否有效..只是为了确定设备是否有问题..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 2020-10-15
  • 1970-01-01
相关资源
最近更新 更多