一、理由
1、起因:因为疫情的原因,导致自己在家上网课,而学习兴趣不大,所以搞一些小玩意来提供自己的学习的兴趣和锻炼下自己,就做了up主,(有兴趣的朋友可以关注下我:算个法)。由学习通的线上考试,自己想到了一个奇妙的方法来应付学习通的线上考试,那就是用两部手机来作弊,一部作为客户端,分享屏幕,一部作为服务端,接受屏幕和提取屏幕的文字(最初可能有点作弊的想法,最后就没有了,期末还是好好复习好,这博客只是为了交流技术,不是作弊)。
2、经过:之后就网上乱找资源,最后在一位博主的指导下完成了该小玩意(博主账号:Android唐浮),最后谢谢博主的帮忙。
3、结果:
客户端有缺点,就是只能用一次,点击停止服务后会出现anr,不知道为什么,解决了朋友望告知(目测应该是我在循环中一直创造新变量的原因)
二、方法
就是客户端不断截屏,通过socket发送给服务端,服务器通过百度OCR(文字识别)获取文字。
三、截屏的实现
1、类和方法
①、获得屏幕的参数
类:WindowManager或者方法:getResources()
②、得到surface(手机屏幕)类
MediaProjectionManage
MediaProjection
ImageReader (ImageReader是截屏的,如果要录屏用 MediaRecord)
VirtualDisplay
③文件的类
File、FileOutputStream、FileOutputStream
④ImageReader 中的surface转换为Bitmap类
ImageReader ,image,Bitmap
2、权限
//读写磁盘
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
//记录权限,录屏
<uses-permission android:name="android.permission.RECORD_AUDIO" />
//获得系统情况
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
//写其他外存
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
3、步骤(详细看代码)
①初始化一个MediaProjectionManager
②创建并启动Intent
③在onActivityResult中拿到MediaProjection所需数据,并创建MediaProjection
④创建ImageReader类,为了之后接受surface
⑤创建VirtualDisplay,给ImageReader surface
⑥ImageReader装换为Bitmap
⑦Bitmap存储在文件中
4、代码问题
就是不能一直录屏,容易出现anr问题