当前位置:操作系统 > 安卓/Android >>

Android 模拟器的上使用GPS的bug

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

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

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


[cpp]
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 ); 
                        } 
                    } 
             

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,