论文写完,感觉头脑好久没被灵感刺激了,前些天室友介绍了个小游戏,我突然来了灵感可以写的简单的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. Android ——单元测试

    什么是单元测试 首先需要介绍一下什么是单元测试.很多人像我一样,本科并不是计算机专业出身的,如果在职的公司不要求做单元测试的话,可能对这个词并没有一个确切的概念.而即使是计算机专业出身,如果毕业以后写 ...

  2. hdu1004

    Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...

  3. XML代码生成器——XMLFACTORY 简介(二)

    XML代码生成器——XMLFACTORY 简介(二)      因为春节和项目上线的原因,离写上一篇文章的时间已经好久了. 不知道是事情太多了,还是自已效率太低了.总之是时间不够用. 哎,苦逼的程序员 ...

  4. sql表结构和注释

    SELECT 表名=case when a.colorder=1 then d.name else '' end, 表说明=case when a.colorder=1 then isnull(f.v ...

  5. 如何全面解决ECSHOP的jquery冲突

    主要就是Ecshop的AJAX传输类,transport.js中重写了object的对象原型,从而导致了与jq框架的冲突. 解决: 1. 删除transport.js中587行 - 636行中关于ob ...

  6. Apache commons-client authentication(授权)

    import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.UsernamePasswo ...

  7. jQuery中bind方法和live方法区别解析

    Javascript中的事件有它的独特性,有默认的执行事件,例如冒泡就是其中的一个.在很多比较复杂的应用程序中,停止事件的冒泡或捕获在程序开发当中是十分有用的,而在IE中有它的独特方式来阻止事件的冒泡 ...

  8. maven不打包子模块资源文件

    在maven多模块项目中,对子模块中的测试文件不需要打包到目标项目中,以免产生影响.实现方法: 1. 将测试资源放在java/test/resources 目录下,mvn package默认不会将te ...

  9. android颜色指列表

    <?xml version="1.0" encoding="utf-8" ?> 2 <resources> 3 <color na ...

  10. 《C与指针》第十二章练习

    本章例程 //12.3 #include <stdio.h> #include <stdlib.h> typedef struct NODE{ struct NODE *lin ...