如何使用Android APIlogging屏幕并截取屏幕截图?

背景

Android获得了Kitkat和Lollipop上的新API,用于video捕捉屏幕。 你可以通过ADB工具,或通过代码(从棒棒糖开始)。

自从新的API出来以后,许多应用程序都使用这个function,允许logging屏幕,而且微软甚至制作了自己的Google-Now-On-tap竞争对手的应用程序。

使用ADB,您可以使用:

adb shell screenrecord /sdcard/video.mp4 

你甚至可以从Android Studio本身。

问题

我找不到任何关于如何使用API​​的教程或解释,代码中的含义。

我发现了什么

我发现的唯一的地方是文档( 在这里 ,“屏幕捕获和共享”),告诉我这一点:

Android 5.0允许您使用新的android.media.projection API为您的应用程序添加屏幕捕获和屏幕共享function。 例如,如果要在video会议应用程序中启用屏幕共享,此function很有用。

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

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

事情是,我无法find任何“MediaProjectionDemo”示例。 相反,我find了“屏幕截图”样本,但我不明白它是如何工作的,因为当我运行它时,我所看到的只是一个闪烁的屏幕,我不认为它会将video保存到一份文件。 样品似乎非常错误。

问题

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

  1. 开始录制,可select包括audio(麦克风/扬声器/两者)。
  2. 停止录制
  3. 截图而不是video。

另外,我如何定制它(分辨率,请求fps,颜色,时间…)?

Solutions Collecting From Web of "如何使用Android APIlogging屏幕并截取屏幕截图?"

Ken White正确地build议并且您可能已经涵盖的第一步是正式提供的示例代码 。

我早些时候使用过他们的API。 我同意截图非常简单。 但是,屏幕录制也是类似的。

我会在三个部分回答你的问题,并将结合一个链接。 🙂


1.开始video录制

 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.停止video录制

  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。 暂停和恢复video录制

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

希望代码有帮助。 这里是我提到的代码的原始链接 ,并且从这个代码中导出了这个实现(video录制)。


3.截图而不是video

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

[编辑]:代码encryption的截图

一个。 根据设备宽度/高度创build虚拟显示

 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); 

然后根据意图或操作启动屏幕捕获 –

 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.JPEG, 100, fos); 

Media Projection API有几种实现(完整代码) 。 其他一些可以帮助你开发的链接 –

  1. 使用MediaProjectionManager进行video录制 – 网站

  2. Android的ScreenCapture –根据Android开发人员的意见的github 🙂

  3. screenrecorder – github

  4. 使用MediaProjection API捕获并loggingAndroid屏幕 – 网站


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

PS:你能告诉我你正在谈论的微软应用程序吗? 我没有用过 想尝试一下:)