wallhaven-533030.jpg

颜色拾取器分析

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

录屏和截屏

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

集成方法:

Step 1. Add the JitPack repository to your build file

allprojects {

repositories {

...

maven { url 'https://jitpack.io' }

}

}

Step 2. Add the dependency

dependencies {

implementation 'com.github.tyhjh:ScreenShot:v1.0.1'

}

截屏

简单使用

主要分为两步,第一步是开启录屏;第二步就可以直接获取截屏,返回Bitmap

截图的过程录屏是开启的,录屏开启就可以进行截屏,操作完需要关闭录屏

截屏过程很快,效果很好

//第一次会自动申请录屏权限

ScreenRecordUtil.getInstance().screenShot(this, new OnScreenShotListener() {

@Override

public void screenShot() {

//可以获取截图,可以多次调用

iv_pre.setImageBitmap(ScreenRecordUtil.getInstance().getScreenShot());

//最后关闭录屏服务

ScreenRecordUtil.getInstance().destroy();

}

});

如果是APP外截屏则开启悬浮窗服务,可以通过操作悬浮窗进行截屏

参考文章:Android 截屏方式整理、Android录屏(5.0+)

截屏实现代码

1.初始化一个MediaProjectionManager

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

2.创建并启动Intent

startActivityForResult(mMediaProjectionManager.createScreenCaptureIntent(),REQUEST_MEDIA_PROJECTION);

3.在onActivityResult中拿到MediaProjection

mMediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data);

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

mVirtualDisplay = mMediaProjection.createVirtualDisplay("screen-mirror",

mScreenWidth, mScreenHeight, mScreenDensity,

DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,

mImageReader.getSurface(), null, null);

5.通过ImageReader拿到截图

Image image = null;

image = mImageReader.acquireLatestImage();

while (image == null) {

SystemClock.sleep(10);

image = mImageReader.acquireLatestImage();

}

int width = image.getWidth();

int height = image.getHeight();

final Image.Plane[] planes = image.getPlanes();

final ByteBuffer buffer = planes[0].getBuffer();

//每个像素的间距

int pixelStride = planes[0].getPixelStride();

//总的间距

int rowStride = planes[0].getRowStride();

int rowPadding = rowStride - pixelStride * width;

Bitmap bitmap = Bitmap.createBitmap(width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888);

bitmap.copyPixelsFromBuffer(buffer);

bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height);

image.close();

return bitmap;

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

if (mVirtualDisplay == null) {

return;

}

mVirtualDisplay.release();

mVirtualDisplay = null;

录屏

简单使用

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

v2-24d825761d500ae9a0bf42e4c7a32c88_hd.png-69.3kB

初始化录屏的大小和码率

//码率为32M

private int screenRecordBitrate = 32 * 1024 * 1024;

ScreenRecordUtil.getInstance().init(ScreenUtil.SCREEN_WIDTH, ScreenUtil.SCREEN_HEIGHT, screenRecordBitrate);

开始录屏,设置输出文件

String savePath = MyApplication.baseDir + System.currentTimeMillis() + ".mp4";

//开始录屏

ScreenRecordUtil.getInstance().start(MainActivity.this, savePath);

停止录屏

new Thread(new Runnable() {

@Override

public void run() {

try {

Thread.sleep(60 * 1000);

//结束录屏

ScreenRecordUtil.getInstance().destroy();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}).start();

录屏具体实现

1.在 AndroidManifest 中添加权限,Android 6.0 加入的动态权限申请,如果应用的 targetSdkVersion 是 23,申请敏感权限还需要动态申请

中间操作和截屏一样,就是准备开启录屏

5.创建虚拟屏幕,这一步就是通过 MediaProject 录制屏幕的关键所在,VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR 参数是指创建屏幕镜像,所以我们实际录制内容的是屏幕镜像,但内容和实际屏幕是一样的,并且这里我们把 VirtualDisplay 的渲染目标 Surface 设置为 MediaRecorder 的 getSurface,后面我就可以通过 MediaRecorder 将屏幕内容录制下来,并且存成 video 文件

private void createVirtualDisplay() {

virtualDisplay = mediaProjection.createVirtualDisplay(

"MainScreen",

width,

height,

dpi,

DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,

mediaRecorder.getSurface(),

null, null);

}

6.录制屏幕数据,这里利用 MediaRecord 将屏幕内容保存下来

private void initRecorder() {

File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".mp4");

mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);

mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

mediaRecorder.setOutputFile(file.getAbsolutePath());

mediaRecorder.setVideoSize(width, height);

mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

mediaRecorder.setVideoEncodingBitRate(5 * 1024 * 1024);

mediaRecorder.setVideoFrameRate(30);

try {

mediaRecorder.prepare();

} catch (IOException e) {

e.printStackTrace();

}

}

public boolean startRecord() {

if (mediaProjection == null || running) {

return false;

}

initRecorder();

createVirtualDisplay();

mediaRecorder.start();

running = true;

return true;

}

android 录屏工具,Android截屏、录屏工具相关推荐

  1. android 禁止截屏录屏功能,android 应用禁止截屏录屏

    更新记录 1.0.0(2021-02-01) Android 应用禁止截屏录屏 平台兼容性 Android iOS 适用版本区间:4.4 - 11.0 × 原生插件通用使用流程: 购买插件,选择该插件 ...

  2. android 手机录屏功能,Android录屏功能的实现

    最近做一个Android开发的项目用到了录屏的功能,开始查阅了一些资料和博客,基本上都是在讨论ROOT的.直到后来在github上看到一个比较新的代码,才恍然发现,Android 5.0时候开放了一个 ...

  3. FastStone Capture安装、注册及使用教程(截屏、滚动截图、录屏、图片编辑工具)

    FastStone Capture是一款集截屏.滚动截图.录屏.图片编辑为一体轻量级截图软件.免费试用30天. 如果你需要找一个具有上述红色字描述的功能的软件的话,可以继续往下阅读.若是你想找一个截图 ...

  4. android 屏幕录制方案,Android录屏的三种解决方案

    本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCod ...

  5. android 屏幕录制方案,Android录屏的三种方案

    本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCod ...

  6. Android音频录制方案,Android录屏的三种方案

    本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCod ...

  7. mac android 录屏软件下载,苹果录屏app下载 苹果录屏 for Android V2.1.3 安卓手机版 下载-脚本之家...

    苹果录屏是一款不错的手机录屏软件,该软件能帮助你录制流畅清晰视频,实现屏幕内容实时同步录制,录制视频流畅清晰不卡顿,需要的朋友可以下载使用. 应用介绍 苹果录屏,是一款免费屏幕录制软件,能帮助你录制流 ...

  8. android获取activity截图,Android Activity 不能被截屏的解决方法

    Android Activity 不能被截屏的解决方法 在Activity 添加即可 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECU ...

  9. rtmp推流工具_小熊录屏:支持RTMP直播录屏的手机APP——墨涩网

    小熊录屏软件 小熊录屏是一款支持手机应用介绍小熊录屏(原安卓录屏大师)是一款稳定且优质的免费屏幕录制应用,能帮助你录制流畅清晰的屏幕视频.小熊录屏功能丰富,无需root即可使用,让你轻松录制游戏过程. ...

  10. android 后台截屏代码,Android实现截图和分享功能的代码

    先给大家展示下效果图吧 直接上代码: xml的布局: android:id="@+id/btn_jp" android:layout_marginTop="10dip&q ...

最新文章

  1. python如何离线安装第三方库_离线环境安装python第三方库
  2. 硬盘录像机和服务器,硬盘录像机和视频监控服务器
  3. SAP后台执行大数据量报表(鹦鹉学舌篇)
  4. 通过快速Java和文件序列化加快速度
  5. 4.RabbitMQ Linux安装
  6. Zend Guard 7 , Zend Guard Loader处理PHP加密
  7. [剑指offer][JAVA]面试题第[32-2]题[从上到下打印二叉树][BFS]
  8. npm突然找不到D:\nodejs\node_modules\npm\bin\npm-cli.js的解决方法
  9. tf.nn.embedding_lookup()函数
  10. Simulink Memory vs Unit Delay
  11. VSCode:查看二进制文件
  12. 数列极限:数列极限的性质
  13. 2020cvpr显著性目标检测
  14. 2019,关于我的故事
  15. 批量修正字幕乱码(powershell)
  16. 网站运维:git工具(10):GitLab安装和使用
  17. Linux 6.2 最新合并情况:拓展 ArmSoc 支持,华为代码加速核心功能 715 倍!
  18. 缅怀钟扬教授,5分钟视频回顾伟大植物学家钟扬对人类的贡献
  19. 电商项目:拼团活动设计及表结构设计
  20. 孙子兵孙子兵法全文_孙子兵法:如何应用于软件

热门文章

  1. 如何解决程序员沟通之痛?
  2. 关于阿里云服务器安全组规则
  3. Initializationfailedforhttps://start.spring.ioPleasecheckURLnetwor的解决方法本人亲测
  4. JVM(4)-MAT: 支配树 Dominator Tree
  5. 780. 到达终点 (Reaching Points)
  6. 十二个一的宠物倾向分析
  7. Windows——打印机错误(操作无法完成(错误 0x000006ba)。本地打印机后台处理程序服务没有运行。请重新启动打印机后台处理程序或重新启动计算机。)解决方案
  8. html5 视频缩略图,应用canvas获取video的缩略图
  9. 客户体验管理-运维服务
  10. 集成OpenLDAP与Kerberos实现统一认证(二):基于SSSD同步LDAP账号