首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

Android 模拟器的下使用GPS的bug

2012-09-29 
Android 模拟器的上使用GPS的bug由于最近研究Android 模拟器的GPS模块的实现,发现了模拟器GPS的bug。启动模

Android 模拟器的上使用GPS的bug

由于最近研究Android 模拟器的GPS模块的实现,发现了模拟器GPS的bug。

启动模拟器,通过DDMS发送经纬度,通过应用可以抓到数据,进入设置,安全与位置,关闭GPS,再打开,再次打开GPS测试软件,再次发送经纬度,怎么也收不到。

查看了代码发现Android模拟器中完成GPS模块的功能主要是一个HAL层代码,通过socket接收发送过来的经纬度信息,其中代码是有问题的,GPS模块的工作主要是一个线程,当关闭GPS模块的时候这个线程结束了,再次打开的时候不会去启动这个线程,所以GPS模块就不工作了,具体看如下代码:

static voidgps_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回调函数,再次开启线程。

以上只是我的拙见。

1楼zhangjie20141235分钟前
在线程中的QUIT命令直接调用了return,所以线程结束了!!!!

热点排行