一、理由

1、起因:因为疫情的原因,导致自己在家上网课,而学习兴趣不大,所以搞一些小玩意来提供自己的学习的兴趣和锻炼下自己,就做了up主,(有兴趣的朋友可以关注下我:算个法)。由学习通的线上考试,自己想到了一个奇妙的方法来应付学习通的线上考试,那就是用两部手机来作弊,一部作为客户端,分享屏幕,一部作为服务端,接受屏幕和提取屏幕的文字(最初可能有点作弊的想法,最后就没有了,期末还是好好复习好,这博客只是为了交流技术,不是作弊)。

2、经过:之后就网上乱找资源,最后在一位博主的指导下完成了该小玩意(博主账号:Android唐浮),最后谢谢博主的帮忙。

3、结果:

android 局域网 权限 android局域网推送_android 局域网 权限


android 局域网 权限 android局域网推送_android_02


客户端有缺点,就是只能用一次,点击停止服务后会出现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问题