论文写完,感觉头脑好久没被灵感刺激了,前些天室友介绍了个小游戏,我突然来了灵感可以写的简单的android 程序实现自动运行。主要的过会为三步:

1,Android 屏幕的获取。因为安全的原因,过程比较麻烦,我目前采用的是开启用户调试模式,利用adb脚本反复循环截图。

2,图像分析。这部分代码中有体现,过程比较简单。

3,模拟Click。代码中已经体,,我采用了一种最简单的方法,代码将在下面做详细分析。

先上个图,一口气跑到183分:

分析图片的代码如下,具体过程为:先获取图像->找到纯黑色的区域->分析黑色的间隔->根据间隔计算时间. 其中根据图像获取的一行数据如右侧图,1为黑色区域,0为非黑色区域,

根据1、0便可以计算宽度了.

 package com.hennsun.decode;

 import android.graphics.Bitmap;
import android.util.Log;
public class DecodeImage { /*
* -16777216 表示ARGB的纯黑色
* */
public static byte[] getLightValue(Bitmap image){
int wight = image.getWidth();
int hight = image.getHeight();
int loc = (int)(hight*8/9.5);
byte[] dataA = new byte[wight];
for(int i = 0;i<wight;i++){
if(image.getPixel(i, loc) == -16777216)
dataA[i] = 1;
}
return dataA;
} /**
* 得到间隔宽度
* @param light
* @return
*/
public static int decodeGap(byte[] light){
int start = 0,end1 =0,end2 = light.length ;
for(int i = 0;i<light.length-1;i++){
if(light[i+1]<light[i]){
start = i+1;
Log.d("Plug", "start is " + Integer.toString(start));
break;
}
}
for(int i = start;i<light.length-1;i++){
if(light[i+1]>light[i]){
end1 = i;
Log.d("Plug", "end1 is " + Integer.toString(end1));
break;
}
}
for(int i = end1+1 ;i<light.length-1;i++){
if(light[i+1]<light[i]){
end2 = i;
Log.d("Plug", "end2 is " + Integer.toString(end2));
break;
}
}
if(start == end2+1)
return 0;
else
return (end1+end2)/2 - start;
} /**
* 获得点击的时间
* @param image 游戏的界面
* @param index 为 像素值/ms
* @return
*/
public static float getTime(Bitmap image,float index){
float time = 0;
int gap = 0;
byte[] gray = getLightValue(image);
gap = decodeGap(gray); //return pixe counts.
time = gap/index; //这里采用可调整系数。
Log.d("Plug","the width of the gap is "+Float.toString((float) (5.35*gap/720))+"cm");
return time; } }

关于屏幕的截图,我可以使用adb方式,脚本如下。当然方式比较的多,我选择了相对比较简单的。

:abc
adb shell screencap -p /sdcard/Demo/screen.bmp
ping 127.0.0.1 -n 10>null
goto abc

或下面这种方式都可以实现截屏,我已经验证完全没有问题,但是对就处理流程就有点不同了.

 package com.hennsun.runtime;

 import java.io.BufferedOutputStream;
import java.io.PrintStream; import android.util.Log; public class CaptureScreen {
/**
* http://my.oschina.net/u/2241960/blog/330485
* @param path 图片保存路径
*/
public static void screenshot(String path){
Process process = null;
Log.d("Plug","start to capture screen");
try{
process = Runtime.getRuntime().exec("su");
PrintStream outputStream = null;
try {
outputStream = new PrintStream(new BufferedOutputStream(process.getOutputStream(), 8192));
outputStream.println("screencap -p " + path);
outputStream.flush();
}catch(Exception e){
e.printStackTrace();
} finally {
if (outputStream != null) {
outputStream.close();
}
}
process.waitFor();
}catch(Exception e){
e.printStackTrace();
}finally {
if(process != null){
process.destroy();
}
}
}
}

模拟Touch,我是从下面的参考的部分获取的代码,根据时间间隔便可以操作Touch事件了,不过需要软件Root权限,代码如下:

 /**
* simulate Click
* @param time
*/
private void simulateClick(float time){
try{
Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
//String cmd = "/system/bin/input tap 100 200\n";
//time 为 ms
String timeS = String.valueOf((int)time);
Log.d("Plug", "the necessary time is "+timeS);
String cmd = "/system/bin/input swipe 100 200 100 200 "+timeS+"\n";
os.writeBytes(cmd);
os.writeBytes("exit\n");
os.flush();
os.close();
process.waitFor();
}catch(Exception e){ }
}

以上代码仅做学习交流使用,本文原创,且勿转载!!

视频展示:

Youtube展示链接 https://www.youtube.com/watch?v=sF0PuKGJFUI&feature=youtu.be

这是国外另外一个团队做了,应该是印度人,他做的比较麻烦.

https://www.youtube.com/watch?v=dJW59UliLhc

需要源码的可以访问我的 个人主页 http://www.shareideas.net/

参考:

http://w3facility.org/question/how-to-simulate-touch-from-background-service-with-sendevent-or-other-way/

http://stackoverflow.com/questions/11142843/how-can-i-use-adb-to-send-a-longpress-key-event

https://grymoire.wordpress.com/2014/09/17/remote-input-shell-scripts-for-your-android-device/

Stick hero "攻略", android 代码编写与分析(后台截屏, 后台模拟点击)的更多相关文章

  1. Android开发笔记:安卓程序截屏方法

    1,基于Android SDK的截屏方法 (1)主要就是利用SDK提供的View.getDrawingCache()方法.网上已经有很多的实例了.首先创建一个android project,然后进行L ...

  2. android后台截屏实现(2)--screencap源码修改

    首先找到screencap类在Android源码中的位置,/442/frameworks/base/cmds/screencap/screencap.cpp 源码如下: /* * Copyright ...

  3. android后台截屏实现(3)--编译screencap

    修改好之后就要编译了,screencap的编译是要在源码环境中进行的. 将修改后的screencap.cpp文件替换源码中的原始文件,然后修改screencap的Android.mk文件,修改后的文件 ...

  4. 【Android实战】Bitmap图片的截屏、模糊处理、传递、使用

    项目中遇到了这样一个需求: 当某个条件满足时就截取当前屏幕.并跳转到另外一个页面,同一时候将这个截屏图片作为下一个页面的背景图片,同一时候背景图片须要模糊处理 接下来就一步一步解决这个问题: 1.截取 ...

  5. 二叉查找树速通攻略 图文代码精心编写(Java实现)

    说在前面 如题目所言 这篇文章为了给下一篇二叉查找数做铺垫和前期知识准备,以便大家有良好的阅读体验,本来想合在一起的,但觉得有些长,所以就拆开了哈哈哈,还是新手向,两篇文章有些长,但如果能认真看下去, ...

  6. mac攻略(七) -- 环境变量PATH分析

      一.首先需要了解 1>mac 一般使用bash作为默认shell 2>Mac系统的环境变量,加载顺序为: 1.系统级别的 /etc/profile /etc/bashrc /etc/p ...

  7. android后台截屏实现(1)--源码编译

    前段时间接到任务要实现后台截图并上传的功能,在网上查了好久,发现遇到这类问题的人还不少.经过一番对比后发现还是修改并编译源码中的screencap类然后通过JNI来调用这种方法比较可靠,而其他的在ja ...

  8. 【转】Android 音量键+电源键 截屏代码小结

    http://104zz.iteye.com/blog/1752961 原文地址:http://blog.csdn.net/hk_256/article/details/7306590 ,转载请注明出 ...

  9. [置顶] Android 应用内禁止截屏功能的实现

    截图介绍   Android的调试工具DDMS提供有截屏功能,很多软件也会有截屏功能,在做支付等安全类应用的时候,为了保证用户的资产和系统安全,往往会禁止应用内截屏,禁止之后,在此应用处于前台的情况下 ...

随机推荐

  1. RabbitMQ - TcpConnection析构引发的一次handshake_timeout

    使用RabbitMQ时,连接rabbit-server一直连接失败,代码没有任何错误提示.但是通过rabbitmqctl始终查询不到连接以及创建的queue等信息. 官方的文件demo里面也没有Tcp ...

  2. -webkit-appearance、sselect

    -webkit-appearance 是一个 不规范的属性(unsupported WebKit property),用来改变按钮和其他控件的外观,使其外观类似于原生控件. iOS下的safari中有 ...

  3. PHP 爬虫

    1.爬虫的本质简单来说,就是读取页面源代码,然后用正则匹配得到想要的数据. 示例如下: private function spider_jiuyou_list($listname,$url)    { ...

  4. Dijksktra(测试源代码)

    1.此程序为c++程序 2.以下代码可实现手动输入,即去掉代码中的/*...*/注释符,并同时去掉赋值代码段 3.源代码 #include<iostream> using namespac ...

  5. go get安装第三方包的前提条件和步骤

    首先,你要找到第三方类包所在的网址, 例如:  http://github.com/go-sql-driver/mysql分为命令行自动安装 和 手动下载 然后安装. ( 欢迎加入go语言群: 218 ...

  6. tcp传送xml

    import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.i ...

  7. 遗传算法,实数编码的交叉操作之SBX(模拟二进制交叉)

    本文主要介绍遗传算法(实数编码)的交叉操作中的SBX,模拟二进制交叉. 首先,给出个人用python2.7实现的代码,具体模块已上传到: https://github.com/guojun007/sb ...

  8. java 中List.subList 总结

    今天,维护以前的代码,看到了List.subList这个方法,以前没接触过,对这个就是个小白,今天学习下: java.util.List中有一个subList方法,用来返回一个list的一部分的视图. ...

  9. 数据库SQL优化总结

    1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  10. 用JS实现的类似QQ密码的输入特效

    <input ID="_PSD"></input> <script> function passwordText(ID,pd,mark){ ma ...