- 浏览: 260420 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
sunshine_bean:
第四行改进下URL=`svn info |grep &quo ...
linux判断是否需要svn up的脚本 -
leokelly001:
设置请求头,user-agent就行了
android使用豆瓣API出现500错误及解决方法 -
貌似掉线:
txy7121 写道HandlerFactory和AntiCo ...
大谈android安全2——Activity劫持的防范程序 -
txy7121:
HandlerFactory和AntiConstants这两个 ...
大谈android安全2——Activity劫持的防范程序 -
貌似掉线:
hyc_willie 写道关注着你的框架,希望能见到它的发布 ...
androidkit——Android开发框架
这几周微信游戏“天天连萌”由于第一名总是被一个同学所占据(没办法,我等级不够高游戏细胞又没他好),总在想怎么超越。正好小志同学(http://xiaozhi6156.iteye.com/)发给我一篇帖子,然后我找到原文(http://blog.csdn.net/longteng1116/article/details/12360269),向作者请教了部分问题(该文章下面还有我的大量评论呢),再琢磨了几天,终于自己也实现了这样的一个程序,利用电脑来玩“天天连萌”刷关卡和分数。
对这个程序的思路是这样子的:
1.从手机里截图到电脑。
2.解析这张图,并将其转换为二维数组。
3.循环搜索可以消除的方块对应的两个元素
4.将元素的位置转换为屏幕的坐标,然后对手机进行模拟按键
以上也将我们的焦点聚集在以下四个问题上:
1、如何截图
2、如何进行图像识别,转换为数组
3、连连看搜索算法
4、如何进行模拟按键
下面分别来看这四个问题。
一、在PC端如何对Android手机截图
在电脑端进行Android截图的方法有多种。其中最快的应该是读取/dev/graphics/fb0,但是需要对手机先进行root。如果没有root的话,需要adb连接手机,然后执行adb shell进入android手机终端,将这个目录拷贝到sdcard,然后退出再执行adb pull,将该文件取出。
从网上得到的资料是,这个文件保存了5帧的framebuffer,只要读取出第一帧再进行处理就可以了。这个没试成功,而且这步骤略显麻烦,不适合在我的程序中应用。
上面是第一种方法。
第二种,使用adb shell screencap -p命令。
使用以上命令可以将手机截屏并输出屏幕,但是adb shell在传输时会将结果里的LF转换为CR+LF,所以还需要将结果改一下。如果是linux用户,可以这样做:
如果是windows用户,可以先截图保存到sdcard,再使用adb pull命令将其取出。命令如下:
使用ImageIO类里的API可以读取这里的png图片为BufferedImage对象,当然也可以将BufferedImage对象保存为图片文件。
由于在程序里需要不停地截图,计算,所以这种方法同样不适合用在程序里。
第三种,使用android sdk里的AndroidDebugBridge。
需要引入ddmlib.jar包。然后通过调用AndroidDebugBridge.init(boolean)方法进行初始化,再调用AndroidDebugBridge.createBridge(str, boolean)创建一个AndroidDebugBridge对象,再使用AndroidDebugBridge对象的getDevices()获取所有连接的设备。该方法返回的是IDevice数组,调用IDevice对象的getScreenshot()方法就可以进行截图了。
下面附近我根据网友提供的相关代码整理之后的代码:
最后说下第四种方法。这个是我在做模拟触摸的时候看到的,也是我目前采用的做法。我在做模拟触摸这一部分,用的是chimpchat.jar包里的api(为什么没用monkeyrunner.jar包里的api,具体原因后面会提到)。这里获取的是IChimpDevice对象,它也有截图的方法,即takeSnapshot()方法,返回的是IChimpImage对象,再调用IChimpImage对象的getBufferedImage()方法即可得到屏幕截图的BufferedImage对象。
代码如下:
使用这种方法,截取一张图在我手机上测试,大概是1200ms左右。读取/dev/graphics/fb0文件截图,据说一秒可以截5、6张,但如果通过java来调用的话,略显蛋疼,故不用。
需要注意的是,上面对我手机的截屏,图像是竖直的,而不是水平的。
接下来是将图片转换为2维数组,用到了一个图像识别算法,这些内容将在下一节续述。
对这个程序的思路是这样子的:
1.从手机里截图到电脑。
2.解析这张图,并将其转换为二维数组。
3.循环搜索可以消除的方块对应的两个元素
4.将元素的位置转换为屏幕的坐标,然后对手机进行模拟按键
以上也将我们的焦点聚集在以下四个问题上:
1、如何截图
2、如何进行图像识别,转换为数组
3、连连看搜索算法
4、如何进行模拟按键
下面分别来看这四个问题。
一、在PC端如何对Android手机截图
在电脑端进行Android截图的方法有多种。其中最快的应该是读取/dev/graphics/fb0,但是需要对手机先进行root。如果没有root的话,需要adb连接手机,然后执行adb shell进入android手机终端,将这个目录拷贝到sdcard,然后退出再执行adb pull,将该文件取出。
从网上得到的资料是,这个文件保存了5帧的framebuffer,只要读取出第一帧再进行处理就可以了。这个没试成功,而且这步骤略显麻烦,不适合在我的程序中应用。
上面是第一种方法。
第二种,使用adb shell screencap -p命令。
使用以上命令可以将手机截屏并输出屏幕,但是adb shell在传输时会将结果里的LF转换为CR+LF,所以还需要将结果改一下。如果是linux用户,可以这样做:
adb shell screencap -p | sed 's/\r$//' > screen.png即将每一行末的回车符替换掉,再输出到screen.png。
如果是windows用户,可以先截图保存到sdcard,再使用adb pull命令将其取出。命令如下:
adb shell /system/bin/screencap -p /sdcard/tmp.png adb pull /sdcard/screen.png d:/tmp.png
使用ImageIO类里的API可以读取这里的png图片为BufferedImage对象,当然也可以将BufferedImage对象保存为图片文件。
由于在程序里需要不停地截图,计算,所以这种方法同样不适合用在程序里。
第三种,使用android sdk里的AndroidDebugBridge。
需要引入ddmlib.jar包。然后通过调用AndroidDebugBridge.init(boolean)方法进行初始化,再调用AndroidDebugBridge.createBridge(str, boolean)创建一个AndroidDebugBridge对象,再使用AndroidDebugBridge对象的getDevices()获取所有连接的设备。该方法返回的是IDevice数组,调用IDevice对象的getScreenshot()方法就可以进行截图了。
下面附近我根据网友提供的相关代码整理之后的代码:
/* * @(#)ScreenShot.java Project:lianmeng * Date-Time:2013-10-11 下午1:08:36 * * Copyright (c) 2013 CFuture09, Institute of Software, * Guangdong Ocean University, Zhanjiang, GuangDong, China. * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package pw.msdx.lianmengassistant; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import com.android.ddmlib.AndroidDebugBridge; import com.android.ddmlib.IDevice; import com.android.ddmlib.RawImage; /** * copy from http://bbs.csdn.net/topics/390502035. modify by Geek_Soledad */ public class AdbUtil { public static IDevice connect() { // init the lib // [try to] ensure ADB is running String adbLocation = System.getProperty("com.android.screenshot.bindir"); //$NON-NLS-1$ if (adbLocation != null && adbLocation.length() != 0) { adbLocation += File.separator + "adb"; //$NON-NLS-1$ } else { adbLocation = "adb"; //$NON-NLS-1$ } AndroidDebugBridge.init(false /* debugger support */); AndroidDebugBridge bridge = AndroidDebugBridge .createBridge(adbLocation, true /* forceNewBridge */); // we can't just ask for the device list right away, as the internal // thread getting // them from ADB may not be done getting the first list. // Since we don't really want getDevices() to be blocking, we wait // here manually. int count = 0; while (bridge.hasInitialDeviceList() == false) { try { Thread.sleep(100); count++; } catch (InterruptedException e) { // pass } // let's not wait > 10 sec. if (count > 100) { System.err.println("Timeout getting device list!"); return null; } } // now get the devices IDevice[] devices = bridge.getDevices(); if (devices.length == 0) { System.out.println("No devices found!"); return null; } return devices[0]; } public static BufferedImage screenShot(IDevice device) { RawImage rawImage; try { rawImage = device.getScreenshot(); } catch (Exception ioe) { System.out.println("Unable to get frame buffer: " + ioe.getMessage()); return null; } // device/adb not available? if (rawImage == null) return null; // convert raw data to an Image BufferedImage image = new BufferedImage(rawImage.width, rawImage.height, BufferedImage.TYPE_INT_ARGB); int index = 0; int IndexInc = rawImage.bpp >> 3; for (int y = 0; y < rawImage.height; y++) { for (int x = 0; x < rawImage.width; x++) { int value = rawImage.getARGB(index); index += IndexInc; image.setRGB(x, y, value); } } return image; } /** * Grab an image from an ADB-connected device. */ public static boolean screenShotAndSave(IDevice device, String filepath) throws IOException { boolean result = ImageIO.write(screenShot(device), "png", new File(filepath)); if (result) { System.out.println("file is saved in:" + filepath); } return result; } public static void terminate() { AndroidDebugBridge.terminate(); } }
最后说下第四种方法。这个是我在做模拟触摸的时候看到的,也是我目前采用的做法。我在做模拟触摸这一部分,用的是chimpchat.jar包里的api(为什么没用monkeyrunner.jar包里的api,具体原因后面会提到)。这里获取的是IChimpDevice对象,它也有截图的方法,即takeSnapshot()方法,返回的是IChimpImage对象,再调用IChimpImage对象的getBufferedImage()方法即可得到屏幕截图的BufferedImage对象。
代码如下:
private IChimpDevice mChimpDevice; private AdbBackend adbBack; public Robot() { mImgHash = new ImageHash(); adbBack = new AdbBackend(); mChimpDevice = adbBack.waitForConnection(); } /** * 截图 */ public BufferedImage snapshot() { IChimpImage img; // 这里用一个while循环是有时截图时会抛出超时异常,导致返回的是null对象。 do { img = mChimpDevice.takeSnapshot(); } while (img == null); return img.getBufferedImage(); }
使用这种方法,截取一张图在我手机上测试,大概是1200ms左右。读取/dev/graphics/fb0文件截图,据说一秒可以截5、6张,但如果通过java来调用的话,略显蛋疼,故不用。
需要注意的是,上面对我手机的截屏,图像是竖直的,而不是水平的。
接下来是将图片转换为2维数组,用到了一个图像识别算法,这些内容将在下一节续述。
发表评论
-
利用电脑玩Android版“天天连萌”刷高分(四)——模拟按键及程序优化
2014-01-22 00:14 1711这一系列文章,没想到从去年10月份以来,写了三篇我就忘了写了, ... -
利用电脑玩Android版“天天连萌”刷高分(三)——连连看消除搜索
2013-10-29 17:02 1183差点忘了写接下来的这两篇博客了,这篇如果接不上上一篇,请勿见怪 ... -
利用电脑玩Android版“天天连萌”刷高分(二)——图像识别
2013-10-20 15:44 1540上一篇只是提到了在PC端利用android sdk里面的工具进 ... -
在PC端进行android截屏的多种方法
2013-10-18 11:01 3596昨晚意外的发现在PC端进行截屏的方法相当多,在android ... -
Java获取照片EXIF信息
2013-10-16 17:40 1556目前最简单易用的EXIF信息处理的Java包是Drew Noa ... -
近期计划
2013-09-01 20:02 1233在上一篇(http://maosidiao ... -
Android开源游戏引擎之Angle(二)——开始前的准备
2013-09-01 12:04 2508在上一篇博客(http://mao ... -
Android开源游戏引擎之Angle(一)——概述
2013-08-31 19:26 6044Angle是一个Android平台上 ... -
设置tabWidget标题的字体大小及颜色
2013-03-27 13:47 9461/* * @(#)TextAppearenceUtil ... -
一一对应的键值对象
2013-03-22 13:19 3058最近写程序需要用到一种结构,像HashMap的,但是却是一对一 ... -
桌面小部件AppWidget的使用
2013-02-23 13:49 1726在android平台中,显示在HOME界面的一些挂件,即桌面小 ... -
android使用actionbar与fragment
2013-01-16 23:12 2294android使用actionbar中的tab,及fragme ... -
android使用豆瓣API出现500错误及解决方法
2013-01-10 18:56 6291为团队做一个图书管理的应用,涉及到扫描ISBN然后查询图书信息 ... -
DES加密及解密封装
2012-12-20 23:40 1586/* * @(#)CipherUtil.java ... -
MD5加密封装
2012-12-20 23:38 1539/* * @(#)DigestUtil.java ... -
进入程序的动画IntroActivity增强版
2012-12-11 10:19 1474这是对上一次谈到的android程序进入前的动画的封装(详见: ... -
androidkit发布0.5.3alpha版
2012-12-07 09:26 1315androidkit是一个用于android应用层开发的工具包 ... -
使用Zxing及豆瓣API
2012-12-06 20:30 2399本文原创,转载请注明原文地址:http://maosidiao ... -
androidkit——减少android开发代码的工具包
2012-11-16 22:25 2226androidkit是我学android开发以来,慢慢在封装的 ... -
windows平台下用java解析apk包
2012-11-09 20:05 2386抽空把以前写的解析apk包的工具,重新写了一个,也解决了以前许 ...
相关推荐
《Android游戏星座连萌》是一款深受玩家喜爱的休闲益智类手机游戏,它结合了星座元素和连连看的玩法,为玩家带来独特的娱乐体验。在深入探讨这款游戏之前,我们需要了解Android平台的基础知识以及游戏开发的相关技术...
天天连萌源码
【标题】"安卓Android源码——星座连萌.zip" 提供的是一个基于Android平台开发的休闲游戏“星座连萌”的源代码。这个压缩包中包含了应用程序的可执行文件(星座连萌.apk)以及可能的其他开发资源或配置文件(xzlm)...
基于Java实现的天天连萌游戏自动玩+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于Java实现的天天连萌游戏自动玩+源码,适合毕业设计、课程设计、项目...
【标题】"安卓Android源码——精典源码之星座连萌"是一个关于安卓应用程序开发的项目,重点在于分析和理解其源代码。这个项目的目的是为开发者提供一个学习和研究Android应用开发的实例,特别是针对游戏开发的部分。...
《安卓Android源码——娱乐项目安卓星座连萌》是一个针对Android平台开发的娱乐应用源代码,旨在提供一种轻松有趣的星座连连看游戏体验。这个项目的源码对于学习Android应用开发,尤其是游戏开发的开发者来说,是一...
【标题】"安卓Android源码——[安卓开源]星座连萌.7z" 提供的是一个基于Android平台的开源项目,名为“星座连萌”。这个项目可能是为了展示Android应用程序的开发技术,或者是教学材料,让开发者能够理解并学习...
【安卓Android源码——[安卓开源]星座连萌】是一个以星座为主题的开源安卓游戏项目,其源码可供开发者学习和研究。在这个项目中,我们可以深入理解Android应用开发的基本流程、UI设计、游戏逻辑以及Android平台上的...
总的来说,这个压缩包提供了一个完整的小游戏——"心动连萌"的源代码,对学习游戏开发的程序员而言是一份宝贵的资源。通过深入研究源码,可以了解到游戏开发中的基本架构、数据结构、算法应用、游戏循环、事件处理、...
《Android应用源码解析——以“星座连萌”为例》 在移动开发领域,Android作为全球最广泛使用的操作系统之一,其应用开发对于学生和开发者来说是至关重要的技能。本篇文章将深入探讨一个名为“星座连萌”的Android...
【Android 星座连萌】是一款基于Android平台的毕业设计项目,主要展示了移动应用开发的基本技术和设计理念。这个项目可以作为Android编程初学者深入理解和实践Android应用开发的一个实例,同时也是对毕业设计者展示...
这个压缩包文件“Android应用源码娱乐项目安卓星座连萌.zip”显然包含了开发一个基于Android平台的娱乐应用的源代码,特别是一个与星座相关的游戏——星座连连萌。从描述来看,“源码参考,欢迎下载”,这表明这个...
《Android应用源码之星座连萌》是一款基于Android平台的休闲游戏,它的源代码提供了深入理解Android应用开发的宝贵资源。这款应用可能结合了星座知识、消除类游戏玩法以及萌系元素,旨在吸引广大用户群体,尤其是...
"H5小游戏源码 一起来玩心动连萌吧!"这个压缩包文件为我们提供了一款名为“心动连萌”的H5游戏的源代码,对于学习和开发H5游戏的爱好者来说,这是一个宝贵的资源。 首先,我们来了解什么是H5小游戏。H5,全称HTML5...
Android应用源码娱乐项目安卓星座连萌