[关闭]
@Tyhj 2018-10-25T07:41:39.000000Z 字数 3038 阅读 1890

Android截屏、录屏工具

Android


原文链接:https://www.jianshu.com/p/8a428fb45098

颜色拾取器分析

有时候会用到颜色拾取器这样的东西来查看屏幕上的颜色值,一直是用Pixolor这个软件来看颜色的;很方便,点哪里显示哪里,也没有延迟,以为是什么黑科技;我注意到一个细节,如果只是切换屏幕,颜色拾取器不会更新,只有移动拾取器才更新选中;可以确定是截屏来实现的了,那就简单了,截屏获取像素点的颜色值就好了

录屏和截屏

网上看了一下,截屏大概分为保存View为图像和调用录屏服务两种办法,录屏是比较好的办法,可以在APP外截屏,所以简单的封装了一下

集成方法:

Step 1. Add the JitPack repository to your build file

  1. allprojects {
  2. repositories {
  3. ...
  4. maven { url 'https://jitpack.io' }
  5. }
  6. }

Step 2. Add the dependency

  1. dependencies {
  2. implementation 'com.github.tyhjh:ScreenShot:v1.0.1'
  3. }

截屏

简单使用

主要分为两步,第一步是开启录屏;第二步就可以直接获取截屏,返回Bitmap
截图的过程录屏是开启的,录屏开启就可以进行截屏,操作完需要关闭录屏
截屏过程很快,效果很好

  1. //第一次会自动申请录屏权限
  2. ScreenRecordUtil.getInstance().screenShot(this, new OnScreenShotListener() {
  3. @Override
  4. public void screenShot() {
  5. //可以获取截图,可以多次调用
  6. iv_pre.setImageBitmap(ScreenRecordUtil.getInstance().getScreenShot());
  7. //最后关闭录屏服务
  8. ScreenRecordUtil.getInstance().destroy();
  9. }
  10. });

如果是APP外截屏则开启悬浮窗服务,可以通过操作悬浮窗进行截屏
参考文章:Android 截屏方式整理

截屏实现代码

1.初始化一个MediaProjectionManager

  1. MediaProjectionManager mMediaProjectionManager = (MediaProjectionManager) activity.getSystemService(Context.MEDIA_PROJECTION_SERVICE);

2.创建并启动Intent

  1. startActivityForResult(mMediaProjectionManager.createScreenCaptureIntent(),REQUEST_MEDIA_PROJECTION);

3.在onActivityResult中拿到MediaProjection

  1. mMediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data);

4.设置VirtualDisplay将图像和展示的View关联起来。一般来说我们会将图像展示到SurfaceView,这里为了为了便于拿到截图,我们使用ImageReader,他内置有SurfaceView。

  1. mVirtualDisplay = mMediaProjection.createVirtualDisplay("screen-mirror",
  2. mScreenWidth, mScreenHeight, mScreenDensity,
  3. DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
  4. mImageReader.getSurface(), null, null);

5.通过ImageReader拿到截图

  1. Image image = null;
  2. image = mImageReader.acquireLatestImage();
  3. while (image == null) {
  4. SystemClock.sleep(10);
  5. image = mImageReader.acquireLatestImage();
  6. }
  7. int width = image.getWidth();
  8. int height = image.getHeight();
  9. final Image.Plane[] planes = image.getPlanes();
  10. final ByteBuffer buffer = planes[0].getBuffer();
  11. //每个像素的间距
  12. int pixelStride = planes[0].getPixelStride();
  13. //总的间距
  14. int rowStride = planes[0].getRowStride();
  15. int rowPadding = rowStride - pixelStride * width;
  16. Bitmap bitmap = Bitmap.createBitmap(width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888);
  17. bitmap.copyPixelsFromBuffer(buffer);
  18. bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height);
  19. image.close();
  20. return bitmap;

6.注意截屏之后要及时关闭VirtualDisplay ,因为VirtualDisplay 是十分消耗内存和电量的。

  1. if (mVirtualDisplay == null) {
  2. return;
  3. }
  4. mVirtualDisplay.release();
  5. mVirtualDisplay = null;

录屏

简单使用

录屏和截屏差不多,只是截屏的时候只是设置了一个ImageReader去获取图像数据,而录屏是设置一个SurfaceView去接收内容,获取视频流,然后通过MediaCodec来实现视频的硬编码,然后保存为视频文件

v2-24d825761d500ae9a0bf42e4c7a32c88_hd.png-69.3kB

初始化录屏的大小和码率

  1. //码率为32M
  2. private int screenRecordBitrate = 32 * 1024 * 1024;
  3. ScreenRecordUtil.getInstance().init(ScreenUtil.SCREEN_WIDTH, ScreenUtil.SCREEN_HEIGHT, screenRecordBitrate);

开始录屏,设置输出文件

  1. String savePath = MyApplication.baseDir + System.currentTimeMillis() + ".mp4";
  2. //开始录屏
  3. ScreenRecordUtil.getInstance().start(MainActivity.this, savePath);

停止录屏

  1. new Thread(new Runnable() {
  2. @Override
  3. public void run() {
  4. try {
  5. Thread.sleep(60 * 1000);
  6. //结束录屏
  7. ScreenRecordUtil.getInstance().destroy();
  8. } catch (InterruptedException e) {
  9. e.printStackTrace();
  10. }
  11. }
  12. }).start();

参考文章:Android视频录制--屏幕录制

项目地址:https://github.com/tyhjh/ScreenShot

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注