Android开发121成都大学

教你用android玩冲顶大会——实现几个小时的财务自由

2018-01-19  本文已影响4023人  何时夕

最近答题类app比较火,玩了几把之后想到为什么不用技术来查找答案呢?因此搞了一款辅助app,能够帮助大家直接搜索答案.经过两天的开发和三天的测试,终于让我的冲顶率达到了80%左右,先上几个不错的战绩装个逼.




一.用app去冲顶

这一节是教大家如何使用app的,如果对使用app不感兴趣,想了解技术的同学,可以直接去第二节,新建了一个辅助交流QQ群:314100393,大家有问题可以来这个群里问。

1.让app跑起来

  1. 安装app。点击下载app
  2. 进入手机的文件管理器,在本app的cache目录下面新建 tessdata目录 和 ShotImage目录。例如我的小米Mix2的目录是:Android/data/com.example.whensunet.chongdingdahui/cache
  3. 将chi_sim.traineddata文件放入上面新建的tessdata文件夹中,这个文件是ocr识别的语言库,没有的话就只能查找题干,不能查找选项点击下载语言库
  4. 在 设置—>无障碍/辅助功能—>WhenSunsetBaiWanYinXiongFuZhu中点击开启,开启app的服务。
  5. 下载夸克浏览器,这个浏览器比较轻便,能够减少查找答案的时间
  6. 打开app,同意所有权限要求,点击屏幕上的按钮,选择搜索引擎
  7. 此时只要点击本app冲顶大会的app的任意按钮,就会跳转到夸克浏览器按钮的内容或者题干+按钮内容进行搜索 ,点击屏幕最底端屏幕最底端上升500像素内的按钮会直接搜索题干。
  8. 如果无效请 进入设置中找到 app的权限界面,然后开启所有权限。
  9. 本app目前适配了mi5、mix2、谷歌nexus5和小米Max,适用于5.0以上的android系统,其他手机可能不能搜索按钮内容,但是题干一般情况下所有手机都能搜索。

2.举个例子

以冲顶大会app来举个例子

  1. 点击2区域中任意选项按钮,将会搜索题目+选项内容
  2. 注意需要让弹幕处于静止状态,要不然可能会搜索到错误答案。
  3. 如果要单独搜索题干,那么需要在3区域点击右下角的按钮,将3区域的输入框唤出并将其限制在3区域中,最后点击输入框,这样就能搜索题干了。

3.冲顶经验

经过3天的测试,我的冲顶率已经达到了80%左右,所以分享几个使用辅助的经验。

  1. 12道题目中一般会有10题是只需要搜索题干的
  2. 一般来说可以准备两只手机,一只运行速度快的手机进行答案的搜索,再搜索到答案之后先帮另一只手机选择答案,然后点击返回键回到本手机的冲顶大会选择答案。
  3. 比较难的场次会有1-2道需要查询选项的题目,此时需要两到三个人,每个人查一个选项,这样能够确保总结出最后的正确答案。
  4. 一般来说ios系统的直播速度比android系统慢2-3秒,可以利用好这个时间差,延长找答案的时间。建议第二只手机使用iphone或者ipad。
  5. 建议如果两个人搜索答案的话,可以一个人使用谷歌搜索,一个人使用百度搜索

二.app用到的技术解析

本节是对本app使用到的技术进行解析,没有兴趣的同学可以直接跳过.

1.需要实现的功能分析

  1. 监听冲顶大会app在前台的时候,我们点击按钮的事件
  2. 获取到被点击按钮的文字内容。
  3. 如果不能获取被点击按钮的文字内容,需要使用ocr技术,对图片进行文字解析
  4. 为了在3的情况下获取到图片,我们需要在运行后台service的时候对屏幕进行截图
  5. 获取到查找内容之后拼接搜索引擎的url,调起浏览器

2.确定了需求之后要使用的技术

1.使用android内置的无障碍服务可以实现监听冲顶大会app的各种事件。
2.我测试的时候发现,冲顶大会做了某些处理,使得不能通过无障碍来获取选项按钮的文字内容,只能获取该view的区域。此时我就想到额使用ocr技术,来识别该区域的文字。具体的库是tess-two,这是一个c++的库,需要开发者自己编译出so文件。然后调用java层的api,来实现ocr识别。
3.在运行在后台的情况下,对屏幕进行截图。这里5.0起的android系统提供了MediaProjection这个api,能够获取当前屏幕的帧。至于5.0以下需要root才能在后台进行屏幕截图,所以就放弃了。
4.可以通过Intent和浏览器包名,调起指定浏览器。这里我用了比较简洁快速的夸克浏览器

3.代码详解

因为某些原因,打算过一段时间之后再放出源码,所以这里就讲解一下,app整个运行流程.当然我放出的apk是debug版,大家如果会反编译的话,还是能看见源码的

  1. 首先是在MainActivity中初始化一些东西
    1. 初始化tess-two的库
    2. 向用户请求无障碍屏幕截图的权限
    3. 运行无障碍service
  2. 1结束之后,此时无障碍service已经运行起来了,当我们点击冲顶大会的一个按钮的时候
    1. 进入了onAccessibilityEvent()方法。 onAccessibilityEvent
      1. 进入了按钮点击的事件
      2. 获取题干信息,这里我们需要注意到的问题是,冲顶大会的题干是不可点击的,所以在getQuestionRecursion方法中我会获取到,当前界面的Root View树的结构,然后递归寻找每个view中符合题干特征的文字.(这里需要大家对 view的绘制原理和view树的结构有一定的了解) getQuestionRecursion
        1. 方法传入的getRootInActiveWindow()是获取到当前屏幕上面window的view树结构
        2. 可以看见方法内部就是对view树进行递归查找
      3. 判断点击区域是否在只查询题干的区域,有了题干信息我们还需要判断,查的是题干还是选项。所以我规定了只要点击了屏幕上某个区域的按钮,那么就是要对题干进行查询。(细心的同学会发现,这个区域就是我前面提到的 屏幕底部 到 底部向上500像素的区域。)getIsSearchQuestion方法内部如图 getIsSearchQuestion
        1. 内部的结构很简单,仅仅是比较当前点击的view的区域,是否在我规定的区域内部
      4. 如果3中返回的字符串不为空,就表示我们需要直接查询题干,此时直接调起夸克浏览器,否则就要识别点击的view区域的图像,来对选项进行查询,这里我们就只讲ocr识别的部分。useOcrToSearch方法内部如图 useOcrToSearch
        1. 这里的代码也很简单,构造MediaProjection
        2. 通过MediaProjection获取一个VirtualDisplay并将ImageReaderSurface放入。
        3. 此时ImageReader中每时每刻都会暂存一张当前屏幕的图片。
        4. 接下来就是处理截图,然后进行ocr识别了,这里使用了AsyncTask在其他线程执行操作。
          1. 前面我们都知道了怎么获取view的区域—————一个Rect,使用这个我们就可以将点击的按钮的区域变成一个bitmap
          2. 有了view区域的图片,就可以直接调用tess-two的java api来进行ocr了。
          3. 最后我们终于获取到了选项的内容,此时就可以调起浏览器进行搜索了。速度挺快的,我的mi5识别起来在500毫秒内,网好的情况下从点击到显示查找界面不会超过1.5秒。

三.总结

上一篇 下一篇

猜你喜欢

热点阅读