Stick hero "攻略", android 代码编写与分析(后台截屏, 后台模拟点击)
论文写完,感觉头脑好久没被灵感刺激了,前些天室友介绍了个小游戏,我突然来了灵感可以写的简单的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 代码编写与分析(后台截屏, 后台模拟点击)的更多相关文章
- Android开发笔记:安卓程序截屏方法
1,基于Android SDK的截屏方法 (1)主要就是利用SDK提供的View.getDrawingCache()方法.网上已经有很多的实例了.首先创建一个android project,然后进行L ...
- android后台截屏实现(2)--screencap源码修改
首先找到screencap类在Android源码中的位置,/442/frameworks/base/cmds/screencap/screencap.cpp 源码如下: /* * Copyright ...
- android后台截屏实现(3)--编译screencap
修改好之后就要编译了,screencap的编译是要在源码环境中进行的. 将修改后的screencap.cpp文件替换源码中的原始文件,然后修改screencap的Android.mk文件,修改后的文件 ...
- 【Android实战】Bitmap图片的截屏、模糊处理、传递、使用
项目中遇到了这样一个需求: 当某个条件满足时就截取当前屏幕.并跳转到另外一个页面,同一时候将这个截屏图片作为下一个页面的背景图片,同一时候背景图片须要模糊处理 接下来就一步一步解决这个问题: 1.截取 ...
- 二叉查找树速通攻略 图文代码精心编写(Java实现)
说在前面 如题目所言 这篇文章为了给下一篇二叉查找数做铺垫和前期知识准备,以便大家有良好的阅读体验,本来想合在一起的,但觉得有些长,所以就拆开了哈哈哈,还是新手向,两篇文章有些长,但如果能认真看下去, ...
- mac攻略(七) -- 环境变量PATH分析
一.首先需要了解 1>mac 一般使用bash作为默认shell 2>Mac系统的环境变量,加载顺序为: 1.系统级别的 /etc/profile /etc/bashrc /etc/p ...
- android后台截屏实现(1)--源码编译
前段时间接到任务要实现后台截图并上传的功能,在网上查了好久,发现遇到这类问题的人还不少.经过一番对比后发现还是修改并编译源码中的screencap类然后通过JNI来调用这种方法比较可靠,而其他的在ja ...
- 【转】Android 音量键+电源键 截屏代码小结
http://104zz.iteye.com/blog/1752961 原文地址:http://blog.csdn.net/hk_256/article/details/7306590 ,转载请注明出 ...
- [置顶] Android 应用内禁止截屏功能的实现
截图介绍 Android的调试工具DDMS提供有截屏功能,很多软件也会有截屏功能,在做支付等安全类应用的时候,为了保证用户的资产和系统安全,往往会禁止应用内截屏,禁止之后,在此应用处于前台的情况下 ...
随机推荐
- Android ——单元测试
什么是单元测试 首先需要介绍一下什么是单元测试.很多人像我一样,本科并不是计算机专业出身的,如果在职的公司不要求做单元测试的话,可能对这个词并没有一个确切的概念.而即使是计算机专业出身,如果毕业以后写 ...
- hdu1004
Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...
- XML代码生成器——XMLFACTORY 简介(二)
XML代码生成器——XMLFACTORY 简介(二) 因为春节和项目上线的原因,离写上一篇文章的时间已经好久了. 不知道是事情太多了,还是自已效率太低了.总之是时间不够用. 哎,苦逼的程序员 ...
- sql表结构和注释
SELECT 表名=case when a.colorder=1 then d.name else '' end, 表说明=case when a.colorder=1 then isnull(f.v ...
- 如何全面解决ECSHOP的jquery冲突
主要就是Ecshop的AJAX传输类,transport.js中重写了object的对象原型,从而导致了与jq框架的冲突. 解决: 1. 删除transport.js中587行 - 636行中关于ob ...
- Apache commons-client authentication(授权)
import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.UsernamePasswo ...
- jQuery中bind方法和live方法区别解析
Javascript中的事件有它的独特性,有默认的执行事件,例如冒泡就是其中的一个.在很多比较复杂的应用程序中,停止事件的冒泡或捕获在程序开发当中是十分有用的,而在IE中有它的独特方式来阻止事件的冒泡 ...
- maven不打包子模块资源文件
在maven多模块项目中,对子模块中的测试文件不需要打包到目标项目中,以免产生影响.实现方法: 1. 将测试资源放在java/test/resources 目录下,mvn package默认不会将te ...
- android颜色指列表
<?xml version="1.0" encoding="utf-8" ?> 2 <resources> 3 <color na ...
- 《C与指针》第十二章练习
本章例程 //12.3 #include <stdio.h> #include <stdlib.h> typedef struct NODE{ struct NODE *lin ...