`
lmx227
  • 浏览: 52379 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Android2.2[GPS模块]源码分析

阅读更多

下面这个程序在会监听GPS 开启,关闭,位置改变,

 

  1. public class MainActivity extends Activity implements LocationListener {  
  2.     /** Called when the activity is first created. */  
  3.     private final static String TAG = "LocationTest";  
  4.     TextView tv;  
  5.     Button btn;  
  6.     private LocationManager lm;  
  7.     public void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.main);  
  10.         // 与Location_service建立连接  
  11.         lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  
  12.         // 注册activity到监听队列中  
  13.         lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1l, 1l, this);  
  14.     }  
  15.     // Location发生变化时会调用这个  
  16.     public void onLocationChanged(Location location) {  
  17.         Log.d(TAG, "location: " + location);  
  18.     }  
  19.     // 关闭GPS卫星会调用这个  
  20.     public void onProviderDisabled(String provider) {  
  21.         Log.d(TAG, "provider disable" + provider);  
  22.     }  
  23.     // 启用GPS卫星会调用这个  
  24.     public void onProviderEnabled(String provider) {  
  25.         Log.d(TAG, "provider enable");  
  26.     }  
  27.     public void onStatusChanged(String provider, int status, Bundle extras) {  
  28.         Log.d(TAG, "status changed status = " + status);  
  29.     }  
  30. }  

 

 

使用GPS 需要这个权限:

< uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION" >

</ uses-permission >

使用GPS 相关的资源,需要先用getSystemService 获得一个LOCATION_SERVICE 的实例,获得这个实例之后就可以进行相关操作了。

@frameworks/base/services/java/com/android/server/SystemServer.java

LOCATION_SERVICE 是在SystemServer.java 中启动的,也就是系统启动之后,这个服务就已经启动了:

ServiceManager.addService(Context.LOCATION_SERVICE, new LocationManagerService(context));

源码结构

主要分为四部分,client ,service ,jni ,hardware

frameworks/base/location/* (client 部分)

frameworks/base/services/java/com/android/serverLocationManagerService.java (server 部分)

frameworks/base/core/jni/android_location_GpsLocationProvider.cpp JNI 部分)

hardware/libhardware_legacy/gps/* hardware 接口部分)

 

1. frameworks/base/location/java (Client 部分)

.

├── android

│   └── location

│   ├── Address.aidl

│   ├── Address.java 描述地理位置信息

│   ├── Criteria.aidl

│   ├── Criteria.java 定位提供商的应用标准

│   ├── Geocoder.java 地理编码,好像是定位信息转换用的

│   ├── GpsSatellite.java 描述当前GPS satellite 信息

│   ├── GpsStatus.java 描述当前GPS engine 信息

│   ├── IGeocodeProvider.aidl

│   ├── IGpsStatusListener.aidl

│   ├── IGpsStatusProvider.aidl

│   ├── ILocationListener.aidl

│   ├── ILocationManager.aidl

│   ├── ILocationProvider.aidl

│   ├── INetInitiatedListener.aidl

│   ├── Location.aidl

│   ├── Location.java 描述定位的详细信息经度,纬度等等

│   ├── LocationListener.java 监听定位服务

│   ├── LocationManager.java 用来访问定位服务AIDL

│   ├── LocationProvider.java 定位提供者信息

│   └── package.html

└── com

└── android

└── internal

└── location

├── DummyLocationProvider.java

├── GpsLocationProvider.java

├── GpsNetInitiatedHandler.java

├── GpsXtraDownloader.java

├── LocationProviderProxy.java

├── MockProvider.java

└── NmeaParser.java

 

2. frameworks/base/services/java/com/android/server/ LocationManagerService.java (server 部分)

 

3. frameworks/base/core/jni/android_location_GpsLocationProvider.cpp (JNI 部分)

 

4. hardware 接口部分)

hardware/libhardware_legacy/gps.h

hardware/libhardware_legacy/gps_ni.h

hardware/libhardware_legacy/gps/*

.

├── Android.mk

├── gps.cpp

└── gps_qemu.c


代码分析

1. 控制通道,也就是由app 层发起的比如enable 或disable 的控制命令,这个在”设置/ 位置和安全设置/ 使用GPS 卫星”里面设置。

LocationManager.java 主要负责通信。具体的实现在LocationManagerService.java 中,通过AIDL 实现通信,接口文件是ILocationManager.aidl 。在LocationManagerService 在初始化的时候,会判断是否有GPS 设备,如果存在则创建了一个GpsLocationProvider.java ,并通过JNI 调 android_location_GpsLocationProvider.cpp ,该文件再通过GPSInterface 来调用硬件的具体实现代码。

 

2. enable 后的Location 数据和状态上报。对于数据的上报过程,主要就是关注几个callback 函数。主要代码分析如下:

在 GpsLocationProvider.java 文件中enable() 一个GpsLocationProvider 时,会启动一个 GpsEventThread, 该线程主要就是调用了native_wait_for_event(); 通过JNI 调用到了android_location_GpsLocationProvider_wait_for_event()@ anroid_location_GpsLocationProvider.cpp ,而该event的触发是由来自硬件驱动 Location 数据包的上报,底层的硬件驱动程序会把raw gps data 通过串口或其他的方式送出来,这个要看gps 驱动的实现了,我们通过自己实现的GpsInterface 来解析raw gps data 并调用loaction_callback() 来触发event 并copy Location 数据,等待到event 后再调用GpsLocationProvider.java 中的reportLocation() 上报Location.

 

另外一部分就是hardware/libhardware_legacy/gps 部分的实现,这个主要就是实现gps.h 里面的几个数据结构:

 

  1.   const void* (*get_extension)(const char* name);  
  2. } GpsInterface;  
  3. typedef struct {  
  4.     uint16_t        flags;  
  5.     double          latitude;  
  6.     double          longitude;  
  7.     double          altitude;  
  8.     float           speed;  
  9.     float           bearing;  
  10.     float           accuracy;  
  11.     GpsUtcTime      timestamp;  
  12. } GpsLocation;   

GpsInterface->init() 的时候要把上层的GpsCallbacks 传进来,然后start 后,从驱动那里poll 获得gps raw data ,并对raw data 进行解析并填充GpsLocation 数据结构,然后调用location_cb 上报location 数据。

  1. //初始化的时候,得到GpsInterface,调用init,并且设置callback函数:  
  2. static jboolean android_location_GpsLocationProvider_init(JNIEnv* env, jobject obj)  
  3. {  
  4.     if (!sGpsInterface)  
  5. padding-top: 0px !important; padding-right: 3px !important; padding-bottom: 0px !important; padding-left: 10px !important; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: solid; border-color: initial; border-left-width: 3px; border-left-color: #6ce26c; background-color: #ffffff; color: inherit; line-height: 14px; mar
    分享到:
    评论

相关推荐

    Android2.2通讯录源码

    本主题将深入探讨Android 2.2(Froyo)版本的通讯录源码,这对于理解Android系统的底层机制,尤其是对于那些希望进行定制化开发或者优化通讯录功能的开发者来说,具有很高的价值。 首先,我们要明白Android 2.2的...

    android 2.2 源码

    总结来说,Android 2.2源码的分析与研究是Android开发中的高级阶段,它不仅有助于理解系统的运作机制,还可以帮助开发者提升代码质量,进行系统级优化。通过深入源码,开发者能够更好地驾驭这一平台,创造出更高效、...

    android 2.2 源码下载 学习必备

    Android 2.2(Froyo)源码学习是Android开发者深入理解系统工作原理和优化应用性能的关键步骤。源码提供了对操作系统内核、库、框架以及用户界面等所有层次的详细视图,使得开发者能够从底层到高层全面了解Android...

    android2.2-adb源码

    在"android2.2-adb源码"中,我们可以深入理解ADB的工作原理及其协议。 首先,ADB主要由三部分组成:服务器端(通常运行在开发者机器上)、设备端(运行在Android设备上)和USB驱动(用于设备与电脑之间的物理连接)...

    android2.2 录音程序完整源码

    针对"android2.2 录音程序完整源码"这个主题,我们将深入探讨Android 2.2(Froyo)版本下的录音API,以及如何实现一个简单的录音应用。这段源码为初学者提供了实践和理解Android录音机制的良好机会。 Android录音...

    android2.2 view widget源码

    总结来说,通过分析Android 2.2的`view`和`widget`源码,开发者可以深入了解Android UI的工作机制,从而更高效地设计和实现自定义组件。同时,对ListAdapter、Scroll和Animation的理解将使你能够构建更加动态和用户...

    android 2.2 源代码

    标题中的“android 2.2 源代码”指的是Android操作系统的Froyo(冻酸奶)版本的源代码。Froyo是Android的一个重大更新,它在2010年发布,带来了诸多性能提升和新功能。源代码的开放性是Android系统的一大特色,它...

    Android2.2 后台发送彩信源码

    总的来说,Android 2.2后台发送彩信的源码分析涵盖了Android服务、`SmsManager` API、权限管理、多媒体数据处理等多个方面,这些都是Android开发中的重要知识点。通过学习和理解这些内容,开发者可以构建出高效且...

    Android 2.2 源码

    通过分析和研究Android 2.2源码,开发者不仅可以了解Android系统的底层运作,还能发现性能瓶颈,优化应用程序,或是开发出独特的系统修改和扩展。源码学习是Android开发者进阶的必经之路,也是提升自身技能的有效...

    Android_2.2_源码结构分析

    通过以上分析,我们可以看出Android 2.2源码的层次分明,每个部分都有其特定的职责。理解这个结构对于开发者调试、优化和扩展系统具有重要意义。无论是编写原生应用还是修改系统组件,熟悉源码结构都是必不可少的...

    android 2.2源码

    通过阅读和分析"sources.rar"中的源码,开发者不仅能理解Android 2.2的运行机制,还能学习到最佳实践,提高代码质量,甚至为社区贡献自己的代码。不过,由于源码量庞大,建议从感兴趣的特定模块入手,逐步深入。同时...

    android 2.2 源码(android2.2 source code)

    android2.2源代码下载,将下载的文件sources.rar解压后放置在android.jar所在目录中。如\android-sdk-windows\platforms\android-8\sources\...包...。 源码包含了android.jar中android包以及apache包的所有源文件。

    Android2.2 ApiDemos

    《Android 2.2 ApiDemos深度解析》 在Android开发领域,ApiDemos是一个非常重要的参考资料,它是由Google官方提供的一个示例程序,包含了Android SDK中的各种API功能的演示。这个项目,针对的是Android 2.2(API...

    Android 2.2 Launcher源码

    《深入剖析Android 2.2 Launcher源码》 在Android操作系统中,Launcher是用户与...通过分析源码,我们可以更好地掌握Android系统的组件交互、UI布局、事件处理和性能优化等关键知识点,从而提高开发效率和应用质量。

    android2.2源码

    用于在Eclipse查看android2.2 jar源代码

    android2.2 adb工具

    在“android2.2 adb工具”这个主题下,我们主要关注的是适用于Android 2.2(Froyo)版本的ADB工具及其相关功能。 ### ADB简介 ADB全称为Android Debug Bridge,它是Google提供的一个开发工具套件的一部分,主要用于...

    Android GPS模块架构分析

    ### Android GPS模块架构分析 #### 一、GPS模块概述与重要性 全球定位系统(Global Positioning System, GPS)是现代移动设备中不可或缺的功能之一。它不仅支持基础的地图导航功能,还广泛应用于各种位置感知应用中...

    lockscreen for android 2.2

    《Android 2.2锁屏应用详解》 在Android操作系统中,锁屏界面是用户与设备交互的第一道关卡,它不仅提供了设备的安全保护,也是展现个性化和用户体验的重要环节。针对Android 2.2(Froyo)版本,有一款特别设计的...

    android2.2源代码下载

    在SDK的安装文件目录中的android 2.2中新建一个sources文件夹,将下载的源代码解压到此文件夹中,重启eclipse即可。一下路径为本人的SDK安装目录: E:\android\android-sdk-windows\platforms\android-8\sources

Global site tag (gtag.js) - Google Analytics