用于在虚拟框中运行的android的假gps

时间:2011-05-06 16:19:11

标签: android gps virtualization vbox

我正在尝试在虚拟机中运行的android中虚拟化GPS设备。我想方便在Android中运行的应用程序使用gps设备或获取假gps位置一些如何。我已经开始查看android模拟器源代码,但同时,任何人都有任何好的开始。

[UPDATE]

为了使它更清楚一点,整个应用程序堆栈将是这样的:

Android app (with gps functionality) to be tested ----> (developed by end user)

Android virtual machine ----> (Guest OS)

virtual box ----> 

Microsoft Windows ---> Host OS 

现在,理想情况下,我希望我的应用程序(如adbddms)在Windows中运行,用户可以在其中为gps设备设置一些坐标值(在没有实际GPS的情况下,否则虚拟化现有的GPS)。这些坐标可供Android应用程序使用。基本上,这与通过运行Android映像的virtual-box提供现有Android模拟器(使用ddms)的功能相同。

我没有运行Android模拟器而且我没有使用eclipse。 :( [更新结束]

谢谢, 维克拉姆。

4 个答案:

答案 0 :(得分:6)

这就是我的做法(以及android堆栈(在vbox上运行)如何工作的简要概述。)

具有GPS功能的Android应用程序使用JNI接口(在frameworks/base/core/jni/android_location_GpsLocationProvider.cpp中导出)在用户模式共享库(通常为libgps.so或libhardware_legacy.so)的底层实现中注册一些回调

这些注册的回调负责通知应用程序的GPS修复(或更改gps位置)。

这是一张简单的图片,展示来自Android -> VBox -> Windows

的来电流程

enter image description here

现在要完成此流程,需要执行以下步骤:

  1. 我创建了自己的libgps.so导出函数gps_get_interface(在gps.h中声明),由JNI接口使用。支持gps的应用程序获取从此libgps.so返回的最新坐标,该坐标实际上由GpsLocationProvider服务加载。

  2. 使用Vbox标头创建另一个共享对象,并包含连接,断开连接和发送功能请求的例程,以便在主机操作系统中运行host service。这些是带有预定义ioctl-numbers的简单ioctl调用(例如:VBOX_GUEST_IOCTL_HGCM_CONNECT等)。

  3. 创建一个主机服务(实际上是一个DLL,由VBox Host Service加载),可以处理从HGCM调用传递的参数,并以步骤2中创建的共享对象的格式返回所需的数据理解。

  4. 现在要将任何虚假/虚拟位置发送回Android VM内运行的应用,您只需要通知host service,其余内容将传回VBox Additions - > libgps.so - > GpsLocationProvider service - >最后到App with GPS Support

  5. 希望这会帮助某人尝试类似的东西,或者帮助一些人了解android堆栈的工作原理。

    注意:编译hgcm代码并将其与android lib链接也有点复杂,因为android libc(以及其他一些libs)中实现的函数数量有限。为了避免这一切,您可以直接打开设备(/ dev / vboxguest)并以vbox和您的主机服务已知的格式对其发出ioctl调用。

答案 1 :(得分:1)

如何使用setTestProviderLocation?

尝试使用模拟位置

答案 2 :(得分:1)

你在日食吗?如果是这样,请使用ddms将模拟位置发送到虚拟设备。

答案 3 :(得分:0)

如果您正在使用eclipse,请转到DDMS,然后转到“模拟器控制”部分。在那里你会看到2个纬度和经度的文本框。然后单击“发送”,该信息将发送到模拟器。

或者你可以通过远程登录模拟器传递GPS信息: 例 telnet localhost 5554 geo fix -82.411629 28.054553

http://www.devx.com/wireless/Article/39239/1954