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提供有截屏功能,很多软件也会有截屏功能,在做支付等安全类应用的时候,为了保证用户的资产和系统安全,往往会禁止应用内截屏,禁止之后,在此应用处于前台的情况下 ...
随机推荐
- Thinkphp_View(1)循环输出
循环输出主要是使用volist和foreach标签输出. VOLIST volist标签通常用于查询数据集(select方法)的结果输出,通常模型的select方法返回的结果是一个二维数组,可以直接使 ...
- PHP 监控服务器动态
预期准备 一个139邮箱,收到邮件后,可以免费给你短信提醒.如果你不需要短信提醒功能,用什么邮箱都可以 另外一个可以运行PHP文件的Web服务器(相当于监控服务器),现在免费的PHP网站空间很多,上网 ...
- js去空格
写成类的方法格式如下:(str.trim();) <script language="javascript"> String.prototype.trim=functi ...
- Eclipse利用Axis2插件构建Web Service并测试
在学习Web Service的时候,从网上找到前辈的博客http://www.cnblogs.com/hexinlin/p/3358558.html,并依此文的方法按部就班:编写欲发布的java类He ...
- 一个简单的python程序
假设我们有这么一项任务:简单测试局域网中的电脑是否连通.这些电脑的ip范围从192.168.0.101到192.168.0.200. import subprocesscmd="cmd.ex ...
- C# 时间转换 Windows的toFileTimeutc时间转换
项目中需要把时间转为Long型,再转车string,而后又需要转行回标准时间,请用下面这句 DateTime d11t1 = DateTime.FromFileTimeUtc();
- setTimeout的应用
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 在项目中导入MRC的文件时解决办法
1.由于在项目中要使用到第三方框架和其他的类的时候,而它用的是MRC的时候,其最简便的方法:完成从MRC到ARC的转换. 1.点击工程文件,进入到工程的设置里面. 2.看见Build Phases,就 ...
- Docker学习(2)
列出本地镜像,位于/var/lib/docker下 ➜ ~ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu ...
- JSBinding+Bridge.Net:框架代码与逻辑代码的关系
在JSB+Bridge工程中你可以同时维护Cs版本和Js版本的游戏. 框架代码:简称framework,表示那些不进行热更的代码.注意,这包括你自己写的代码,也包括引用的Dll,比如UnityEngi ...