android gps 数据流程分析

目录

GPS 位置数据源头

代码流程跟踪分析


GPS 位置数据源头

GPS 位置数据一定是从gps模块反馈回来的,通过Hal往上callback传出去的。

这个我在跟踪gps数据流程时,一直坚信的原则。 奈何android java,hidl hal,jni, driver各层

反复绕在一起。应该是对代码分层没有理清楚。

代码流程跟踪分析

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

\frameworks\base\services\core\jni

com_android_server_location_GnssLocationProvider.cpp  // jni 层

static jmethodID method_reportLocation;

struct GnssCallback : public IGnssCallback {
    Return<void> gnssLocationCb(

Return<void> GnssCallback::gnssLocationCb(
        const ::android::hardware::gnss::V1_0::GnssLocation& location) {

    env->CallVoidMethod(mCallbacksObj,
                        method_reportLocation,
                        boolToJbool(hasLatLong),
                        jLocation);

static void android_location_GnssLocationProvider_class_init_native(JNIEnv* env, jclass clazz) {
    method_reportLocation = env->GetMethodID(clazz, "reportLocation",
            "(ZLandroid/location/Location;)V");  / java类名, java 类方法, 往上走

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

gps/service/mtkgnss.cpp

GpsCallbacks MtkGnss::sGnssCb = { // 对外对内的 接口连接
    .size = sizeof(GpsCallbacks),
    .location_cb = locationCb,
    .status_cb = statusCb,
    .sv_status_cb = gpsSvStatusCb,
    .nmea_cb = nmeaCb,
    .set_capabilities_cb = setCapabilitiesCb,
    .acquire_wakelock_cb = acquireWakelockCb,
    .release_wakelock_cb = releaseWakelockCb,
    .create_thread_cb = createThreadCb,
    .request_utc_time_cb = requestUtcTimeCb,
    .set_system_info_cb = setSystemInfoCb,
    .gnss_sv_status_cb = gnssSvStatusCb,
};

void MtkGnss::locationCb(GpsLocation* location) {
    auto ret = sGnssCbIface->gnssLocationCb(gnssLocation);

往下层走   gps\gps_hal\src\gpsinf3337.c

/* the name of the controlled socket */
#define  GPS_POWER_NAME       "/dev/gps"
#define  GPS_TTY_NAME       "/dev/ttyMT1"

static const GpsInterface  mtkGpsInterface = {
    sizeof(GpsInterface),
    mtk_gps_mt3337_init,
    mtk_gps_mt3337_start,
    mtk_gps_mt3337_stop,
    mtk_gps_mt3337_cleanup,
    mtk_gps_mt3337_inject_time,
    mtk_gps_mt3337_inject_location,
    mtk_gps_mt3337_delete_aiding_data,
    mtk_gps_mt3337_set_position_mode,
    mtk_gps_mt3337_get_extension,
};

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

gps_hal/gpshal_worker.c

static mnl2hal_interface gpshal_mnl2hal_interface = {
    update_mnld_reboot,
    update_location,
    update_gps_status,
    update_gps_sv,
    update_nmea,
    update_gps_capabilities,
    update_gps_measurements,
    update_gps_navigation,
    update_gnss_measurements,
    update_gnss_navigation,
    request_wakelock,
    release_wakelock,
    request_utc_time,
    request_data_conn,
    release_data_conn,
    request_ni_notify,
    request_set_id,
    request_ref_loc,
    output_vzw_debug,
};

void gpshal_worker_thread(__unused void *arg) {
        for (i = 0; i < n; i++) {
            if (events[i].data.fd == g_gpshal_ctx.fd_mnl2hal) {
                if (events[i].events & EPOLLIN) {
                    mnl2hal_hdlr(g_gpshal_ctx.fd_mnl2hal,
                            &gpshal_mnl2hal_interface);
                }

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

gps_hal/src/ hal2mnl_interface.c

// -1 means failure
int mnl2hal_hdlr(int fd, mnl2hal_interface* hdlr) {
    char buff[HAL_MNL_BUFF_SIZE] = {0};
    int offset = 0;
    int ver;
    mnl2hal_cmd cmd;
    int read_len;
    int ret = 0;

    read_len = safe_recvfrom(fd, buff, sizeof(buff));    / 从底层传上来

   case MNL2HAL_LOCATION: {
   
    if (report_time_interval > ++count) {
            LOGD("count is %f, interval is %f\n", count, report_time_interval);
            break;
        }
        count = 0;

        if (hdlr->location) {
           
gps_location location;
            get_binary(buff, &offset, (char*)&location, sizeof(buff), sizeof(gps_location));
            hdlr->location(location);
        } else {

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android GPS 数据采集源码主要包括定位服务的调用、权限获取、位置监听器和数据存储等功能。首先,需要在AndroidManifest.xml文件中申请定位权限,并在代码中动态获取权限。然后通过LocationManager类获取系统定位服务,并注册位置监听器,以便获取定位数据。在位置监听器中,可以通过回调函数得到经纬度、海拔、速度等位置信息,并将其存储到数据库或文件中。同时,可以根据需要设置定位参数,如定位精度、更新频率等。另外,如果需要使用网络定位或基站定位,还可以调用相应的服务和API来获取位置信息。 以下是一个简单的Android GPS 数据采集源码示例: ```java // 在AndroidManifest.xml中添加定位权限 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> // 在代码中动态获取权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, 1); } // 获取位置服务 LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // 注册位置监听器 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10, new LocationListener() { @Override public void onLocationChanged(Location location) { // 获取位置信息并存储 double latitude = location.getLatitude(); double longitude = location.getLongitude(); float speed = location.getSpeed(); // 将位置信息存储到数据库或文件中 } }); // 在合适的时机移除位置监听器 locationManager.removeUpdates(locationListener); ``` 通过以上源码示例,可以实现在Android设备上进行GPS数据的采集和存储。同时,也可以根据需求添加更多的功能,如位置信息的上传和显示等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值