当前位置: 首页 > 知识库问答 >
问题:

如何录制屏幕和截图,使用Android API?

柳墨一
2023-03-14

Android在Kitkat和Lollipop上获得了一个新的API,用于视频捕捉屏幕。您可以通过ADB工具或代码(从Lollipop开始)来完成。

自从新的API发布以来,许多应用程序都使用了这一功能,允许录制屏幕,微软甚至还开发了自己的Google Now On tap竞争对手应用程序。

使用ADB,您可以使用:

adb shell screenrecord /sdcard/video.mp4 

你甚至可以在Android Studio内部完成这项工作。

我找不到任何关于如何使用API的教程或解释,这意味着在代码中。

我找到的唯一地方就是文档(这里,在“屏幕捕获和共享”下),告诉我:

Android 5.0允许您使用新的Android向应用程序添加屏幕捕获和屏幕共享功能。媒体投影API。例如,如果要在视频会议应用程序中启用屏幕共享,此功能非常有用。

新的createVirtualDisplay()方法允许应用将主屏幕(默认显示)的内容捕获到Surface对象中,然后应用可以通过网络发送该对象。该API仅允许捕获非安全屏幕内容,而不允许捕获系统音频。要开始屏幕捕获,您的应用程序必须首先通过使用通过createScreenCaptureIntent()方法获得的Intent启动屏幕捕获对话框来请求用户的权限。

有关如何使用新API的示例,请参见示例项目中的MediaProjectOnDemo类。

问题是,我找不到任何“MediaProjectionDemo”样本。相反,我找到了“屏幕捕获”示例,但我不明白它是如何工作的,因为当我运行它时,我看到的只是一个闪烁的屏幕,我认为它不会将视频保存到文件中。这个样品看起来很有问题。

如何使用新API执行这些操作:

  1. 开始录音,可选包括音频(麦克风/扬声器/两者)
  2. 停止录制
  3. 用截图代替视频

此外,我如何自定义它(分辨率,要求的fps,颜色,时间...)?

共有1个答案

斜单鹗
2023-03-14

第一步,也是肯·怀特正确建议的那一步

我以前使用过他们的API。我同意截图很直接。但是,屏幕录制也在类似的线路下。

我将分三个部分回答您的问题,并以一个链接作为结尾。:)

1.开始录像

private void startScreenRecord(final Intent intent) {
 if (DEBUG) Log.v(TAG, "startScreenRecord:sMuxer=" + sMuxer);
 synchronized(sSync) {
  if (sMuxer == null) {
   final int resultCode = intent.getIntExtra(EXTRA_RESULT_CODE, 0);
   // get MediaProjection 
   final MediaProjection projection = mMediaProjectionManager.getMediaProjection(resultCode, intent);
   if (projection != null) {
    final DisplayMetrics metrics = getResources().getDisplayMetrics();
    final int density = metrics.densityDpi;

    if (DEBUG) Log.v(TAG, "startRecording:");
    try {
     sMuxer = new MediaMuxerWrapper(".mp4"); // if you record audio only, ".m4a" is also OK. 
     if (true) {
      // for screen capturing 
      new MediaScreenEncoder(sMuxer, mMediaEncoderListener,
       projection, metrics.widthPixels, metrics.heightPixels, density);
     }
     if (true) {
      // for audio capturing 
      new MediaAudioEncoder(sMuxer, mMediaEncoderListener);
     }
     sMuxer.prepare();
     sMuxer.startRecording();
    } catch (final IOException e) {
     Log.e(TAG, "startScreenRecord:", e);
    }
   }
  }
 }
}

2.停止录像

 private void stopScreenRecord() {
  if (DEBUG) Log.v(TAG, "stopScreenRecord:sMuxer=" + sMuxer);
  synchronized(sSync) {
   if (sMuxer != null) {
    sMuxer.stopRecording();
    sMuxer = null;
    // you should not wait here 
   }
  }
 }

2.5. 暂停并恢复视频录制

 private void pauseScreenRecord() {
  synchronized(sSync) {
   if (sMuxer != null) {
    sMuxer.pauseRecording();
   }
  }
 }

 private void resumeScreenRecord() {
  synchronized(sSync) {
   if (sMuxer != null) {
    sMuxer.resumeRecording();
   }
  }
 }

希望代码有帮助。这是我提到的代码的原始链接,也是这个实现(视频录制)的来源。

3.拍摄屏幕截图而不是视频

我认为默认情况下,以位图格式捕获图像很容易。您仍然可以继续使用MediaProjectionDemo示例来捕获屏幕截图。

[编辑]:屏幕截图的代码加密

a、 根据设备宽度/高度创建虚拟显示

mImageReader = ImageReader.newInstance(mWidth, mHeight, PixelFormat.RGBA_8888, 2);
mVirtualDisplay = sMediaProjection.createVirtualDisplay(SCREENCAP_NAME, mWidth, mHeight, mDensity, VIRTUAL_DISPLAY_FLAGS, mImageReader.getSurface(), null, mHandler);
mImageReader.setOnImageAvailableListener(new ImageAvailableListener(), mHandler);

b、 然后根据意图或动作启动屏幕捕获-

startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);

停止媒体放映-

sMediaProjection.stop();

C.然后转换成图像-

//Process the media capture
image = mImageReader.acquireLatestImage();
Image.Plane[] planes = image.getPlanes();
ByteBuffer buffer = planes[0].getBuffer();
int pixelStride = planes[0].getPixelStride();
int rowStride = planes[0].getRowStride();
int rowPadding = rowStride - pixelStride * mWidth;
//Create bitmap
bitmap = Bitmap.createBitmap(mWidth + rowPadding / pixelStride, mHeight, Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(buffer);
//Write Bitmap to file in some path on the phone
fos = new FileOutputStream(STORE_DIRECTORY + "/myscreen_" + IMAGES_PRODUCED + ".png");
bitmap.compress(CompressFormat.PNG, 100, fos);
fos.close();

有几种媒体投影API的实现(完整代码)。其他一些可以帮助你发展的链接-

>

  • 使用MediaProjectionManager录制视频-网站

    android截屏-github 根据android开发者的观察:)

    屏幕记录器-github

    使用MediaProjectionAPI捕获并录制Android屏幕-网站

    希望有帮助:)快乐的编码和屏幕录制!

    PS:你能告诉我你所说的微软应用程序吗?我没有用过。想试试吗:)

  •  类似资料:
    • 我需要使用Sikuli的自动化,但我无法采取截图。问题是,当我点击“截屏”或“创建区域”时,IDE会被隐藏,但选择区域选项不会出现....

    • 我想让应用程序像“简易屏幕录制器”。我必须从哪里开始,因为我搜索了很多,但没有找到任何开始的链接。有任何用于创建屏幕录制器的api,而不是屏幕截图。我不想使用javacv从屏幕截图创建视频。我只想让用户启动应用程序,点击开始录制按钮,然后用户在手机上所做的一切来录制这些内容。 1) Android系统中是否有相关的api。 2) 如何在android中创建屏幕录制器应用程序。 3)是没有任何api

    • 我试图根据用户输入的坐标捕捉区域截图。基本上,用户在屏幕上点击得到x,y坐标,然后在其他地方点击另一对x,y坐标,然后将其放入一个矩形中,并使用机器人库创建屏幕截图。 我有的问题是,我得到了随机截图,这不是用户输入的坐标,我怎么能考虑包括0的坐标,因为矩形值必须超过1。 以下是我迄今为止的代码:

    • 在Linux下有很多屏幕载图的工具,下面简单介绍一下: 在GNOME桌面中自带了一个屏幕截图工具,位于“动作”栏内。该工具功能很少,只能截取当前屏幕。 在GMIP中也可截图,在“文件”--“获取”菜单下有一个“屏幕抓图”选项可进行屏幕截图。它可截取任意图窗口的内容,并自动输入到GMIP中,我们可方便地进行处理和保存。 安装ImageMagick软件,它有一个工具叫import可用于屏幕截图。该工具

    • 点击按钮进行截屏,可以将截屏图像保存到相册中。 作者说:听说会和苹果的策略有冲突,应用如果上架可能会被拒绝。这个估计是看人品了吧。经过测试发现,如果先弹出对话框,然后再截屏,似乎并不能把对话框也给保存下来。 [Code4App.com]

    • 我是新来的颤振,有谁能帮助我知道如何实现屏幕设计,如使用颤振截图所示。