由于最近研究Android 模拟器的GPS模块的实现,发现了模拟器GPS的bug。
启动模拟器,通过DDMS发送经纬度,通过应用可以抓到数据,进入设置,安全与位置,关闭GPS,再打开,再次打开GPS测试软件,再次发送经纬度,怎么也收不到。
查看了代码发现Android模拟器中完成GPS模块的功能主要是一个HAL层代码,通过socket接收发送过来的经纬度信息,其中代码是有问题的,GPS模块的工作主要是一个线程,当关闭GPS模块的时候这个线程结束了,再次打开的时候不会去启动这个线程,所以GPS模块就不工作了,具体看如下代码:
static void
gps_state_thread( void* arg )
{
GpsState* state = (GpsState*) arg;
NmeaReader reader[1];
int epoll_fd = epoll_create(2);
int started = 0;
int gps_fd = state->fd;
int control_fd = state->control[1];
nmea_reader_init( reader );
// register control file descriptors for polling
epoll_register( epoll_fd, control_fd );
epoll_register( epoll_fd, gps_fd );
D("gps thread running");
// now loop
for (;;) {
struct epoll_event events[2];
int ne, nevents;
nevents = epoll_wait( epoll_fd, events, 2, -1 );
if (nevents < 0) {
if (errno != EINTR)
LOGE("epoll_wait() unexpected error: %s", strerror(errno));
continue;
}
D("gps thread received %d events", nevents);
for (ne = 0; ne < nevents; ne++) {
if ((events[ne].events & (EPOLLERR|EPOLLHUP)) != 0) {
LOGE("EPOLLERR or EPOLLHUP after epoll_wait() !?");
return;
}
if ((events[ne].events & EPOLLIN) != 0) {
int fd = events[ne].data.fd;
if (fd == control_fd)
{
char cmd = 255;
int ret;
D("gps control fd event");
do {
ret = read( fd, &cmd, 1 );
} while (ret < 0 && errno == EINTR);
if (cmd == CMD_QUIT) {
D("gps thread quitting on demand");
return;
}
else if (cmd == CMD_START) {
if (!started) {
D("gps thread starting location_cb=%p", state->callbacks.location_cb);
started = 1;
nmea_reader_set_callback( reader, state->callbacks.location_cb );
}
}
else if (cmd == CMD_STOP) {
if (started) {
D("gps thread stopping");
started = 0;
nmea_reader_set_callback( reader, NULL );
}
}
}
else if (fd == gps_fd)
{
char buff[32];
D("gps fd event");
for (;;) {
int nn, ret;
ret = read( fd, buff, sizeof(buff) );
if (ret < 0) {
if (errno == EINTR)
continue;
if (errno != EWOULDBLOCK)
LOGE("error while reading from gps daemon socket: %s:", strerror(errno));
break;
}
D("received %d bytes: %.*s", ret, ret, buff);
for (nn = 0; nn < ret; nn++)
nmea_reader_addc( reader, buff[nn] );
}
D("gps fd event end");
}
else
{
LOGE("epoll_wait() returned unkown fd %d ?", fd);
}
}
}
}
}
若要修改的话,就是在setting中开始追代码喽,在再次开启GPS模块的时候再调用init回调函数,再次开启线程。
以上只是我的拙见。
分享到:
相关推荐
android模拟器使用gps定位,模拟实现GPS传感器经纬坐标数据的获取。
Android 模拟器下载与使用建议教程 Android 模拟器是 Android 操作系统的模拟环境,允许开发者在计算机上模拟 Android 设备的行为,以便测试和调试 Android 应用程序。以下是关于 Android 模拟器下载与使用建议教程...
然后,将 android123.apk 文件复制到 Android SDK 的 Tools 目录中(点击下载 Android123.apk 文件),使用 cmd 的 cd 命令定位到 Android 模拟器目录 Tools 中,执行 adb install android123.apk 命令,这时模拟器...
android开发所使用的 模拟器系统源码,用于练习时需要跳转到模拟器自带页面时 ,设置隐式意图 , 查看意图过滤器等等。ceshiguo eclipse自带 AVD模拟器 和 genymotion模拟器
Android 模拟器永久root工具------包含 (android for img.rar、Android SU文件更新包.zip、RootExplorer.apkSuperuser.apk) 1、用android for img.rar里的android for img.exe打开 E:\SDK\platforms\android-8\...
如何在 android 模拟器中使用SDCard
android模拟器java Androidandroid模拟器java Androidandroid模拟器java Androidandroid模拟器java Androidandroid模拟器java Androidandroid模拟器java Androidandroid模拟器java Androidandroid模拟器java Android...
Android模拟器入门Android模拟器入门Android模拟器入门Android模拟器入门Android模拟器入门Android模拟器入门Android模拟器入门
做Android开发,模拟器是必备品,而Android模拟器的IP和电脑总不是一个网段的,想要进行测试非常麻烦,甚至很多时候模拟器没有办法连接互联网,本文详细的描述了Android模拟器IP设置的完整步骤。
android模拟器修改host.docx
Android 模拟器建立端口映射讲解 redir Android 模拟器建立端口映射
Android模拟器使用SD卡(转载http://blog.sina.com.cn/s/blog_4de067e40100nwd1.html)
NULL 博文链接:https://iaio.iteye.com/blog/1413232
Android模拟器躲避的检测与应对,介绍模拟器检测的主要方法
如何修改Android模拟器的IMSI,简单方法。
关于android模拟器启动时遇到的问题进行解决~
android模拟器不能使用电脑键盘解决
如何在Android模拟器上安装和卸载APK程序包
如何在Android模拟器上安装和卸载APK包
Android模拟器介绍,介绍了Android模拟器的原理,使用方法等。用openoffice打开