android 2.3 gps流程分析

基于Android的AGPS流程分析 ​ 基于Android的代码,辅助定位有两种,分别为AGPS和XTRA。 AGPS即辅助全球卫星定位系统(英语:Assisted Global Positioning System,简称:AGPS)指的是一种GPS的运行方式。它可以利用手机基地站的资讯,配合传统GPS卫星,让定位的速度更快。 XTRA是高通提供的一个可以下发星历信息的解决法案,类似AGPS。 都是辅助定位用的。 ​ 阅读详情

转载请注明出处:http://blog.youkuaiyun.com/lbmygf/article/details/7063692

一  相关文件路径

Framework: 

framework\base\services\java\com\android\server\systemServer.java

framework\services\java\com\android\server\LocationManagerService.java

frameworks\base\services\java\com\android\server\location\GpsLocationProvider.java

JNI:   /framework/base/services/jni/com_android_server_location_GpsLocationProvider.cpp

HAL: /hardware/mx5x/gps/   //此处路径可能不一样

二 调用流程

1.Framework

systemServer.java:

    public static final void init2() {

        Slog.i(TAG, "Entered the Android system server!");

        Thread thr = new ServerThread();

        thr.setName("android.server.ServerThread");

        thr.start();

    }

init2函数中启动了一个线程来注册Android的诸多服务,如:Bluetooth Service,NetworkManagement Service,Notification Manager等,当然也包括Location Service。

在ServerThread线程的run函数中LocationManager服务的代码段如下:

class ServerThread extends Thread 

{

......

            try {

                Slog.i(TAG, "Location Manager");

                location = new LocationManagerService(context); 

//实例化一个LocationManagerService对象。

                ServiceManager.addService(Context.LOCATION_SERVICE, location);

            } catch (Throwable e) {

                Slog.e(TAG, "Failure starting Location Manager", e);

            }

......

   final LocationManagerService locationF = location;

......

if (locationF != null) locationF.systemReady(); 

//调用LocationManagerService对象的systemReady() 方法。

......

}

  

   LocationManagerService.java

 void systemReady() {

        // we defer starting up the service until the system is ready 

        Thread thread = new Thread(null, this, "LocationManagerService");

        thread.start();//start 线程

}

    public void run()

    {

        Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

        Looper.prepare();

        mLocationHandler = new LocationWorkerHandler();

        initialize();

        Looper.loop();

    }

  private void initialize() 

{

......

loadProviders();

......

}

    private void loadProviders() {

        synchronized (mLock) {

            if (sProvidersLoaded) {

                return;

            }

            // Load providers

            loadProvidersLocked();

            sProvidersLoaded = true;

        }

    }

private void loadProvidersLocked() {

        try {

            _loadProvidersLocked();

        } catch (Exception e) {

            Slog.e(TAG, "Exception loading providers:", e);

        }

}

 private void _loadProvidersLocked() {

 if (GpsLocationProvider.isSupported()) 

......

}

GpsLocationProvider.java

    public static boolean isSupported() {

        return native_is_supported();

}

在GpsLocationProvider.java最后:

    private static native boolean native_is_supported();

//声明一个native 函数

//native 是java关键字,表示它将由JNI完成。

    private native boolean native_init();

    private native void native_cleanup();

    private native boolean native_set_position_mode(int mode, int recurrence, int min_interval, int preferred_accuracy, int preferred_time);

    private native boolean native_start();

    private native boolean native_stop();

2.JNI

com_android_server_location_GpsLocationProvider.cpp

static JNINativeMethod sMethods[] = {

     /* name, signature, funcPtr */

    {"class_init_native", "()V", (void *)android_location_GpsLocationProvider_class_init_native},

    {"native_is_supported", "()Z", (void*)android_location_GpsLocationProvider_is_supported},

    {"native_init", "()Z", (void*)android_location_GpsLocationProvider_init},

    {"native_cleanup", "()V", (void*)android_location_GpsLocationProvider_cleanup},

    {"native_set_position_mode", "(IIIII)Z",  (void*)android_location_GpsLocationProvider_set_position_mode},

    {"native_start", "()Z", (void*)android_location_GpsLocationProvider_start},

    {"native_stop", "()Z", (void*)android_location_GpsLocationProvider_stop},

.........

};

int register_android_server_location_GpsLocationProvider(JNIEnv* env)

{

    return jniRegisterNativeMethods(env, "com/android/server/location/GpsLocationProvider", sMethods, NELEM(sMethods));

}

  这就把java层声明的native函数与JNI 函数关联起来。

static jboolean android_location_GpsLocationProvider_is_supported

(JNIEnv* env, jclass clazz) 

{

return (sGpsInterface != NULL || get_gps_interface() != NULL);

//get_gps_interface()返回值不为空,开启gps服务

}

static const GpsInterface* get_gps_interface() {

    int err;

    hw_module_t* module;

    const GpsInterface* interface = NULL;

    err = hw_get_module(GPS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);//得到模块信息

    if (err == 0) {

        hw_device_t* device;

        err = module->methods->open(module, GPS_HARDWARE_MODULE_ID, &device);//打开模块

//得到gps device信息

        if (err == 0) {

     gps_device_t* gps_device = (gps_device_t *)device;

            interface = gps_device->get_gps_interface(gps_device);

//得到的GPS HAL接口

        }

    }

    return interface; 

}

3、HAL

gpst.c

static const GpsInterface  qemuGpsInterface = {

    sizeof(GpsInterface),

    qemu_gps_init,

    qemu_gps_start,

    qemu_gps_stop,

    qemu_gps_cleanup,

    qemu_gps_inject_time,

    qemu_gps_inject_location,

    qemu_gps_delete_aiding_data,

    qemu_gps_set_position_mode,

    qemu_gps_get_extension,

};

const GpsInterface* gps__get_gps_interface(struct gps_device_t* dev)

{

    return &qemuGpsInterface;//还回接口地址

}

static int open_gps(const struct hw_module_t* module, char const* name,

        struct hw_device_t** device)

{

    struct gps_device_t *dev = malloc(sizeof(struct gps_device_t));

    memset(dev, 0, sizeof(*dev));

    dev->common.tag = HARDWARE_DEVICE_TAG;

    dev->common.version = 0;

    dev->common.module = (struct hw_module_t*)module;

    dev->get_gps_interface = gps__get_gps_interface;

    *device = (struct hw_device_t*)dev; //填充JNI device

    return 0;

}

static struct hw_module_methods_t gps_module_methods = {

    .open = open_gps

};

const struct hw_module_t HAL_MODULE_INFO_SYM = {

    .tag = HARDWARE_MODULE_TAG,

    .version_major = 1,

    .version_minor = 0,

    .id = GPS_HARDWARE_MODULE_ID,  //JNI 根据此ID找到相应库文件

    .name = "Goldfish GPS Module",

    .author = "The Android Open Source Project",

    .methods = &gps_module_methods,

};

到此如果gps HAL接口(qemuGpsInterface)不为空,则说明系统支持gps服务。

第一个流程到此结束,下面看下gps服务的开启

再回到   LocationManagerService.java

private void _loadProvidersLocked() {

......

   if (GpsLocationProvider.isSupported()) 

......

  updateProvidersLocked();

}

    private void updateProvidersLocked() {

        boolean changesMade = false;

        for (int i = mProviders.size() - 1; i >= 0; i--) {

            LocationProviderInterface p = mProviders.get(i);

            boolean isEnabled = p.isEnabled();

            String name = p.getName();

            boolean shouldBeEnabled = isAllowedBySettingsLocked(name);

            if (isEnabled && !shouldBeEnabled) {

                updateProviderListenersLocked(name, false);

                changesMade = true;

            } else if (!isEnabled && shouldBeEnabled) {

                updateProviderListenersLocked(name, true);

                changesMade = true;

            }

        }

        if (changesMade) {

            mContext.sendBroadcast(new Intent(LocationManager.PROVIDERS_CHANGED_ACTION));

        }

    }

private void updateProviderListenersLocked(String provider, boolean enabled)

{

......

LocationProviderInterface p = mProvidersByName.get(provider);

//LocationProviderInterface 为一个接口类,它的实现在

// GpsLocationProvider.java

//public class GpsLocationProvider implements LocationProviderInterface

// {...}

......

        if (enabled) {

            p.enable();

 //开启gps服务,在GpsLocationProvider.java的实现

 //很简单,发送一个gps enable 消息

            if (listeners > 0) {

                p.setMinTime(getMinTimeLocked(provider), mTmpWorkSource);

                p.enableLocationTracking(true); // start gps apk时调用

            }

        } else {

            p.enableLocationTracking(false);// 关闭gps服务

            p.disable();//stop gps apk时调用

        }

}

GpsLocationProvider.java

    public void enable() {

        synchronized (mHandler) {

            sendMessage(ENABLE, 1, null);

        }

}

  private final class ProviderHandler extends Handler {

        @Override

        public void handleMessage(Message msg) {

            int message = msg.what;

            switch (message) {

                case ENABLE:

                    if (msg.arg1 == 1) {

                        handleEnable();

                    } else {

                        handleDisable();

                    }

                    break;

                case ENABLE_TRACKING:

                    handleEnableLocationTracking(msg.arg1 == 1);

                    break;

                case REQUEST_SINGLE_SHOT:

                    handleRequestSingleShot();

                    break;

                case UPDATE_NETWORK_STATE:

                    handleUpdateNetworkState(msg.arg1, (NetworkInfo)msg.obj);

                    break;

                case INJECT_NTP_TIME:

                    handleInjectNtpTime();

                    break;

                case DOWNLOAD_XTRA_DATA:

                    if (mSupportsXtra) {

                        handleDownloadXtraData();

                    }

                    break;

                case UPDATE_LOCATION:

                    handleUpdateLocation((Location)msg.obj);

                    break;

                case ADD_LISTENER:

                    handleAddListener(msg.arg1);

                    break;

                case REMOVE_LISTENER:

                    handleRemoveListener(msg.arg1);

                    break;

            }

         ......

            }

        }

    };

    private void handleEnable() {

        if (mEnabled) return;

        mEnabled = native_init();

 // 定义 private native boolean native_init();

 //调用JNI 的android_location_GpsLocationProvider_init方法

        if (mEnabled) {

            mSupportsXtra = native_supports_xtra();

            if (mSuplServerHost != null) {

                native_set_agps_server(AGPS_TYPE_SUPL, mSuplServerHost, mSuplServerPort);

            }

            if (mC2KServerHost != null) {

                native_set_agps_server(AGPS_TYPE_C2K, mC2KServerHost, mC2KServerPort);

            }

        } else {

            Log.w(TAG, "Failed to enable location provider");

        }

}

static jboolean android_location_GpsLocationProvider_init(JNIEnv* env, jobject obj)

{

    const GpsInterface* interface = GetGpsInterface(env, obj);

    if (!interface)

        return false;

    if (!sGpsDebugInterface)

       sGpsDebugInterface = 

(const GpsDebugInterface*)interface->get_extension(GPS_DEBUG_INTERFACE);

    return true;

}

static const GpsInterface* GetGpsInterface(JNIEnv* env, jobject obj) {

    // this must be set before calling into the HAL library

    if (!mCallbacksObj)

        mCallbacksObj = env->NewGlobalRef(obj);

    if (!sGpsInterface) { 

// this must be called in native_init 

        sGpsInterface = get_gps_interface();//得到HAL接口

        if (!sGpsInterface || sGpsInterface->init(&sGpsCallbacks) != 0) {

            sGpsInterface = NULL;

            return NULL;

        }

    }

    return sGpsInterface;

}

gps.c

static int qemu_gps_init(GpsCallbacks* callbacks)

{

   gps_exit_flag = 0;

    GpsState*  s = _gps_state;

    s->callbacks = *callbacks;  // JNI传下回调函数

    if (!s->init)

        gps_state_init(s);

    if (s->fd < 0)

    {

        return -1;

    }

    return 0;

}

static void

gps_state_init( GpsState*  state )

{

    state->init       = 1;

    state->control[0] = -1;

    state->control[1] = -1;

    state->fd         = -1;

    state->fd = gps_channel_open( &state->channel,

                                   GPSHARDWARE_CHANNEL_NAME,

                                   O_RDONLY );

//打开串口,设置波特率

    if (state->fd < 0) {

        LOGE("no gps hardware detected");

        return;

    }

    if ( socketpair( AF_LOCAL, SOCK_STREAM, 0, state->control ) < 0 ) {

        LOGE("could not create thread control socket pair: %s", strerror(errno));

        goto Fail;

    }

     state->callbacks.create_thread_cb("qemu_gps",  gps_state_thread, state); 

 //创建 gps服务线程

 //for android 2.3

     int fd_sleep, i = -1;

     fd_sleep = open("/dev/gps_sleep", O_RDWR);

     i  = ioctl(fd_sleep, 111, 0);

     close(fd_sleep);

    D("gps state initialized ok");

    return;

Fail:

    gps_state_done( state );

}

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];  

    state->thread = pthread_self();

 

    nmea_reader_init( reader );

    // register control file descriptors for polling

    epoll_register( epoll_fd, control_fd );

    epoll_register( epoll_fd, gps_fd );

//注册监控control_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 );

    //当control_fd或gps_fd 有数据写入时程序往下走,否则阻塞。

    //init 到此结束

        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() !?");

                goto Exit;

            }

            if ((events[ne].events & EPOLLIN) != 0) {

                int  fd = events[ne].data.fd;

                if (fd == control_fd)

                {

                    char  cmd = 255;

                    int   ret;

                    do {

                        ret = read( fd, &cmd, 1 );

                    } while (ret < 0 && errno == EINTR);

                    if (cmd == CMD_QUIT) {

                        LOGD("gps thread quitting on demand");

                        goto Exit;

                    }

                 else if (cmd == CMD_START) 

    {       

                        if (!started)

  {

                            started = 1;

   g_status.status = GPS_STATUS_SESSION_BEGIN ;

                            state->callbacks.status_cb(&g_status);

   //上传gps状态

                            nmea_reader_set_callback( reader, state->callbacks.location_cb );

           nmea_reader_set_sv_callback( reader, state->callbacks.sv_status_cb ); 

      //传递回调函数,解码时reader作为参数传下去

                        }

                    }

                    else if (cmd == CMD_STOP) 

     {

                        if (started) 

         {

                            started = 0;

   g_status.status = GPS_STATUS_SESSION_END;

                            state->callbacks.status_cb(&g_status);

                            nmea_reader_set_callback( reader, NULL );

                        }

                    }

                }

                else if (fd == gps_fd) //gps serial

                {

                    char  buff[70];

                    for (;;) 

     {

if(gps_read_switch == 1 && gps_read_flags == 1) //add bu liu for gps start

{  

    started = 1;

    g_status.status = GPS_STATUS_SESSION_BEGIN ;

                             state->callbacks.status_cb(&g_status);

    nmea_reader_set_callback( reader, state->callbacks.location_cb );

            nmea_reader_set_sv_callback( reader, state->callbacks.sv_status_cb ); 

    gps_read_flags = 0;

  }

 if(gps_read_switch  == 0)   //add bu liu for gps stop

  {

      started = 0;

      g_status.status = GPS_STATUS_SESSION_END;

                               state->callbacks.status_cb(&g_status);

      nmea_reader_set_callback( reader,NULL );

              nmea_reader_set_sv_callback( reader, NULL); 

      gps_read_flags == 1;

  }

 if(gps_exit_flag == 1)  //add by liu for gps clearup

 {

       started = 0;

       g_status.status = GPS_STATUS_ENGINE_OFF;

                                state->callbacks.status_cb(&g_status);

                                nmea_reader_set_callback( reader, NULL );

       nmea_reader_set_sv_callback( reader, NULL); 

       gps_exit_flag = 0;

       goto Exit;

 }

                        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));

   goto Exit;

                         }

                        for (nn = 0; nn < ret; nn++)

                            nmea_reader_addc( reader, buff[nn] );//数据解码

                    }

                }

                else

                {

                    LOGE("epoll_wait() returned unkown fd %d ?", fd);

                }

            }

        }

    }

Exit:

    return ;

}

===================================================================

static int qemu_gps_start()

{

    GpsState*  s = _gps_state;

    if (!s->init) {

        LOGE("%s: called with uninitialized state !!\n", __FUNCTION__);

        return -1;

    }

    gps_read_switch = 1;

    gps_read_flags = 1;

           gps_state_start(s);

    return 0;

}

gps_state_start( GpsState*  s )

{

    char  cmd = CMD_START;

    int   ret;

    do { ret=write( s->control[0], &cmd, 1 ); } //向control_fd 写入数据。

   while (ret < 0 && errno == EINTR);

    if (ret != 1)

        LOGE("%s: could not send CMD_START command: ret=%d: %s",

          __FUNCTION__, ret, strerror(errno));

}

=================================================================

Gps 数据格式

$GPGSA,A,2,03,06,14,19,,,,,,,,,41.7,38.7,15.6*07
$GPGSV,3,1,11,3,38,189,41,6,49,170,41,14,24,142,34,16,66,328,*73
$GPGSV,3,2,11,19,10,195,33,20,22,269,,23,23,322,,24,03,142,35*74
$GPGSV,3,3,11,29,07,040,,31,40,056,,32,33,246,,,,,*45
$GPRMC,063752.864,A,2238.2513,N,11400.5476,E,1.06,357.72,270610,,,A*6A
$GPGGA,063753.864,2238.2512,N,11400.5477,E,1,04,38.7,119.1,M,-3.2,M,,*74

nmea_reader_addc( NmeaReader*  r, int  c )

{

    if (r->overflow) {

        r->overflow = (c != '\n');

        return;

    }

    if (r->pos >= (int) sizeof(r->in)-1 ) {

        r->overflow = 1;

        r->pos      = 0;

        return;

    }

    r->in[r->pos] = (char)c;//将信息放入数组

    r->pos       += 1;

    if (c == '\n') {

        nmea_reader_parse( r );

        r->pos = 0;

    }

}

static void 

nmea_reader_parse( NmeaReader*  r )

{

    int i;

    NmeaTokenizer  tzer[1];

    Token          tok;

SVinfos    svInfo[4];

 

    if (r->pos < 9) {

       D("Too short. discarded.");

        return;

    }

    nmea_tokenizer_init(tzer, r->in, r->in + r->pos); //去掉多余信息

    tok = nmea_tokenizer_get(tzer, 0);

//获取前一字段信息   

//$GPGGA,063754.864,2238.2511,N,11400.5477,E,1,04,38.7,119.1,M,-3.2,M,,*70

    if (tok.p + 5 > tok.end) {//GPRXX

        D("sentence id '%.*s' too short, ignored.", tok.end-tok.p, tok.p);

        return;

    }

    // ignore first two characters.

    tok.p += 2;

    if ( !memcmp(tok.p, "GGA", 3) ) {//判断语句类型

        Token  tok_time          = nmea_tokenizer_get(tzer,1);

        Token  tok_latitude      = nmea_tokenizer_get(tzer,2);

        Token  tok_latitudeHemi  = nmea_tokenizer_get(tzer,3);

        Token  tok_longitude     = nmea_tokenizer_get(tzer,4);

        Token  tok_longitudeHemi = nmea_tokenizer_get(tzer,5);

      Token  tok_hdop = nmea_tokenizer_get(tzer,8);      

        Token  tok_altitude      = nmea_tokenizer_get(tzer,9);

        Token  tok_altitudeUnits = nmea_tokenizer_get(tzer,10);

        nmea_reader_update_time(r, tok_time);

        nmea_reader_update_latlong(r, tok_latitude,

                                      tok_latitudeHemi.p[0],

                                      tok_longitude,

                                      tok_longitudeHemi.p[0]);

        nmea_reader_update_altitude(r, tok_altitude, tok_altitudeUnits);

    nmea_reader_update_hdop(r, tok_hdop); 

    r->fix.size = sizeof(r->fix);

    }

......

       if (r->callback) {

           r->callback( &r->fix ); //用回调函数上传数据

           r->fix.flags = 0;

       }

       else {

           D("no callback, keeping data until needed !");

       }

   

if (r->sv_callback) {

           r->sv_callback( &r->sv );//用回调函数上传数据

       }

       else {

           D("no sv_callback, keeping data until needed !");

       }

    }

}

到此结束。

Android系统Gps分析(一) 1 GPS架构 2 GPS分析 2.1 头文件 头文件定义在:hardware/libhardware/include/hardware/gps.h,定义了GPS底层相关的结构体和接口 GpsLocation GPS位置信息结构体,包含经纬度,高度,速度,方位角等。 /** Flags to indicate which values are 阅读详情

相关推荐

Android GPS源码分析总结

Android GPS源码分析总结 本篇主要包括如下内容: 1. 术语介绍 2. 应用层开发总结 3. framework分析 4. HAL层接口介绍 1. 术语介绍 1.1 GNSS GNSS为Global Navigation Satellite System的缩写,即全球导航卫星系统。当前应用较广泛的主要有美国的GPS、俄罗斯的GLONASS、欧盟的GALILEO和中国北斗卫星导航系统等...

CAESAR的专栏 5029

Android GPS模块学习心得

应用程序不能直接创建 LocationManager 实例对象,必须通过调用 Context 的 getSystemService 方 法获取,例如:   mLocationManager =              (LocationManager)mContext.getSystemService(Context.LOCATION_SERVICE);  往下跟踪,如何通

807

android gps机制分析--之二

1,概述 在android系统中,GPS对应的系统服务为LocationManagerService,本文主要论述LocationManagerService服务的启动以及初始化过程。    SystemServer.java的startOtherServices方法中添加LocationManagerService方法的代码如下, location = new LocationManage

Jack的博客 8357

android2.3 gps 架构流程

转载请注明出处:http://blog.csdn.net/lbmygf/article/details/7063692 一  相关文件路径 Framework:  framework\base\services\java\com\android\server\systemServer.java framework\services\java\com\android\server\Loc

曼云-->孤峰 4105

Andorid QCOM GPS: 代码流程

GPS基础知识 http://fancyerii.github.io/2020/04/06/gps/ 常见术语 信噪比,英文名称叫做SNR或S/N(SIGNAL-NOISE RATIO),又称为讯噪比。 是指一个电子设备或者电子系统中信号与噪声的比例 , 信噪比越大此颗卫星越有效(也就是说可以定位) 伪随机噪声(PRN)码: 用于表示卫星相关的信息 TTFF Time to first...

u011279649的专栏 4104

android关于GPS hal层的分析

主控: Samsung   Cortex  ARM A8  smdkc110  1G Gps:    Ublox-G6010 系统:  android 2.3 以下篇幅都是本人的一些建议以及做法 在android里关于普通GPS模块(俗称硬GPS)相对来说是比较简单的,因为android都帮你封装好了,我们要做的稍后做详解。 1

huabinbin110的专栏 1911

和菜鸟一起学android4.0.3源码之硬件gps简单移植

关于android定位方式 android 定位一般有四种方法,这四种方式分别是GPS定位、WIFI定位、基站定位、AGPS定位。 1、 Android GPS 需要GPS硬件支持直接和卫星交互来获取当前经纬度,这种方式需要手机支持GPS模块现在大部分的智能机应该都有了。通过GPS方式准确度是最高的但是它的缺点也非常明显。 1、 比较耗电 2、 绝大部分用户默认不开启GPS模块 3、

东月之神 2万+

安卓10源码开发定制(21)GPS定位研究(3)修改GPS定位数据测试gps定位代码

安卓10源码开发定制(21)GPS定位研究(3)修改GPS定位数据测试gps定位代码 文章首发微信公众号:QDROID88888,如果感兴趣可以关注一下公众号。 一、测试gps定位功能的方法探讨 在安卓App gps定位开发过程中,往往需要进行GPS定位的测试。由于室内gps信号被挡住了,所以如果需要测试gps定位的代码,要么跑到室外去等待gps定位更新或者使用安卓sdk中提供的"MOCK_LOCATION"功能编写额外的测试代码来模拟gps位置更新。如果从系统定制的角度出发,也可以根据gps上报的流程

xiaomaNo01的专栏 2360

北斗gps Android hal层so库代码

网上下载的代码,自己编辑修改,加入了北斗定位功能,主要是修改了GSV,GSA语句的解析,在A10平台上测试良好: 北斗双模下的LOG: $GPGSV,3,3,10,31,46,012,,32,39,287,40*79 $BDGSV,1,1,04,02,45,242,43,03,00,000,34,06,00,000,32,09,38,216,37*6C $GNRMC,040059.08

xiaofengcanyue2013的专栏 1万+

树莓派与ROS2

树莓派与ROS2(Robot Operating System 2)的结合使用为机器人开发、自动化控制以及物联网项目提供了强大的平台。

weixin_47695827的博客 1754

零中频架构实战:用Matlab模拟AD9361收发信号(附完整代码)

本文详细介绍了如何使用Matlab模拟AD9361射频收发器的零中频架构,解决镜像干扰等关键挑战。通过完整的代码示例和系统级建模方法,帮助工程师掌握RFIC设计中的自适应校准算法和性能优化技巧,特别适用于SDR系统开发。

weixin_30733003的博客 541

[android2.3]GPS启动流程及数据流向分析

GPS启动流程及数据流向分析:  首先在系统init阶段,会通过ServiceManager addService添加很多的Service,这其中就包含LocationService。 代码在SystemServer.java中: try { Slog.i(TAG, "Location Manager"); location = new LocationManagerS

kondykuang的专栏 2196

【王道训练营 C/C++方向基础 60 题(31-40)】

王道训练营 C/C++方向基础 60 题(31-40)

qq_55805517的博客 3067

STM32寄存器白话手册:从点灯到中断的底层实战指南

内存映射是嵌入式系统访问硬件的基础机制,它将外设寄存器映射到CPU地址空间,使软件能直接控制硬件。通过读写特定地址,开发者可配置GPIO、时钟、中断等外设,实现底层精准控制。掌握寄存器操作能提升调试效率,解决库函数难以处理的底层问题。在STM32开发中,GPIO配置、RCC时钟使能、NVIC中断管理是常见应用场景。本文以白话方式解析STM32寄存器,涵盖GPIO、RCC、USART、NVIC等核心外设,提供从点灯到中断的完整实操指南,帮助开发者建立底层思维,快速定位和解决实际问题。

weixin_34208283的博客 375

CCS导入工程报错?手把手教你安装C2000编译器(附最新下载链接)

本文详细解析CCS导入工程报错的常见原因,并提供三种安装C2000编译器的解决方案(TI官网离线安装、CCS内置更新和App Center渠道)。通过版本匹配技巧和路径配置要点,帮助开发者快速解决编译器缺失问题,确保项目顺利导入和编译。

weixin_30374009的博客 662

从SolidWorks到Simscape:URDF导出模型错位的5个常见原因及修复方法

本文深入分析了从SolidWorks导出URDF模型到Simscape时出现模型错位的5个常见原因,包括坐标系定义、RPY角陷阱、轴方向统一、质量属性导出和层次结构错乱,并提供了详细的修复方法和实战技巧,帮助工程师高效解决模型错位问题。

weixin_30664051的博客 442

【Android】GPS启动流程及数据流向分析(基于2.3.5)

GPS启动流程及数据流向分析: 首先在系统init阶段,会通过ServiceManager addService添加很多的Service,这其中就包含LocationService。代码在SystemServer.java中:             try {                  Slog.i(TAG, "Location Manager");                  l...

weixin_34184158的博客 359

经典算法之——解决全排列问题以及详解

回溯”指的是“状态重置”,可以理解为“恢复现场”,是在编码的过程中,是为了节约空间而使用的,而在递归或者深度优先中根据需要的场合来配合回溯法可以进一步对自己的代码进行优化。, n-1, n},方向都为向左。邻位对换法是全排列生成算法中的其中一种,它的换位是双向的,通过保存数字的“方向性”来快速得到下一个排列。最后以 3 开头的全排列为[3, 1, 2], [3, 2, 1];以 1 开头的全排列为[1, 2, 3], [1, 3, 2];以 2 开头的全排列为[2, 1, 3], [2, 3, 1];

m0_68987535的博客 8794

Android 从GPS中获取位置信息流程分析

简单分析Android从GPS中获取位置信息流程,主要分析从用户端请求GPS位置信息到底层分发位置信息给用户的流程

weixin_42265250的博客 5512

从实习生到独立上手:我是如何用海思PQTool搞定IPC图像调试的

本文分享了从实习生到独立使用海思PQTool进行IPC图像调试的成长历程。通过工具搭建、核心参数调整和实战案例,详细介绍了如何高效解决图像质量问题,特别强调了ISP调试中的关键参数和实用技巧,适合刚入门的图像调试工程师参考。

weixin_33756596的博客 312

从零开始学 AUTOSAR:深入浅出 SAE J1939 诊断通信管理器(J1939Dcm)深度完整版

SAE J1939 是美国汽车工程师学会制定的重型车辆 CAN 总线通信标准,覆盖卡车、客车、工程机械、农机、船舶等,是商用车领域的 “通用语言”。基于CAN 2.0B 扩展帧(29 位 ID)(车规主流)PGN(参数组号)+ SPN(可疑参数号)核心标准:J1939-21:数据链路层(CAN 帧格式、地址声明)J1939-71:应用层(普通信号、报文)诊断层(核心!J1939Dcm 依据)J1939-81:网络管理(地址管理、节点检测)

getusushu的博客 115

android GPS驱动

android GPS驱动 关于android定位方式 android 定位一般有四种方法,这四种方式分别是GPS定位、WIFI定位、基站定位、AGPS定位。 1、 Android GPS 需要GPS硬件支持直接和卫星交互来获取当前经纬度,这种方式需要手机支持GPS模块现在大部分的智能机应该都有了。通过GPS方式准确度是最高的但是它的缺点也非常明显。 1、 比较耗电 2、 绝大部...

ll148305879的博客 6687

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

android 2.3 gps移植杂记(一)

近期任务是把产品的gps适配到android2.3源码中,一般的移植做法是:从串口中读取gps nema数据,在gps硬件适配层(HAL)对数据进行解析并上报到Framework层。我的任务需求不同,对串口的读写操作统一由一个串口代理负责,gps只需与串口代理通信,获取nema数据。     概括来说,gps移植有以下几个工作: (1)在串口代理中实现socket进程通信服务端,负责把串口代理

达闻东的专栏 8680

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

android gps机制分析--之一

1,android gps实现方案 整个流程图如下, android 系统中高通定位方案架构图如下, GPS Application(各种GPS定位的apk)都通过android系统的LocationManager对GPS进行打开/关闭/启动等操作。 然后等待数据的上报。所以架构中有2个流程,由上往下的控制流,由下往上的数据流。 1, GPS Applicatio

Jack的博客 7090

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: android apk安装原理分析
下一篇: Android按键事件处理分析 .
yongheng_123
博客等级 码龄18年 23粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值