第10章 GPS位置服务与地图编程 QQ号:1281147324 QQ群:490420731(Android编程入门) 网络资源: http://www.xs360.cn/book
主要内容
10.1 GPS位置服务编程 位置服务(Location-Based Services,LBS),又称定位服务或基于位置的服务,融合了GPS定位、移动通信、导航等多种技术,提供了与空间位置相关的综合应用服务。
10.1.1 支持位置服务的核心API Android为支持位置服务,提供了android.location包,该包中包含了与位置信息密切相关的类和接口,主要有:LocationManager、LocationProvider、Location、LocationListener。 LocationManager(定位管理者)类是访问android系统位置服务的入口,所有定位相关的服务、对象都将由该类的对象来产生。和其他服务一样,程序不能直接创建LocationManager对象,而是通过Context的getSystemService()方法来获取。 LocationManager locMg=getSystemService(Context.LOCATION_SERVICE) ;
10.1.1支持位置服务的核心API 一旦得到了LocationManager对象,即可调用LocationManager类的方法获取定位相关的服务和对象,例如获取最佳定位提供者、实现临近警报功能等,该类的常用方法如下: public String getBestProvider (Criteria criteria, boolean enabledOnly):根据指定条件返回最优的LocationProvider;criteria表示过滤条件,enabledOnly表示是否要求处于启用状态; public Location getLastKnownLocation (String provider):根据LocationProvider获取最近一次已知的Location,provider表示提供上次位置的LocationProvider名称; public LocationProvider getProvider (String name):根据名称返回LocationProvider; public List<String> getProviders (boolean enabledOnly):获取所有可用的LocationProvider; public void requestLocationUpdates (String provider, long minTime, float minDistance, PendingIntent intent):通过指定的LocationProvider周期性地获取定位信息,并通过intent启动相应的组件,进行事件处理,provider表示LocationProvider的名称,mimTime表示每次更新的时间间隔,单位为毫秒,minDistance表示更新的最近位置,单位为米,intent每次更新时启动的组件;
10.1.1支持位置服务的核心API LocationProvider(定位提供者)类是对定位组件的抽象表示,用来提供定位信息,能够周期性的报告设备的地理位置,Android中支持多种LocationProvider,它们以不同的技术提供设备的当前位置,区别在于定位的精度、速度和成本等方面。常用的LocationProvider主要有以下两种。 network:由LocationManager.NETWORK_PROVIDER常量表示,代表通过网络获取定位信息的Location Provider对象; gps:由LocationManager.GPS_PROVIDER常量表示,代表通过GPS获取定位信息的LocationProvider对象。 GPS相对来说精度更高,但它只能在户外工作,很费电,并且不能像用户期望的那样立即就能返回位置信息,而网络位置提供器使用手机发射塔或Wi-Fi信号来判断用户位置,在室内室外都能工作、响应速度快,并且更加省电。
10.1.1支持位置服务的核心API LocationProvider类的常用方法如下: int getAccuracy():返回该LocationProvider的精度; String getName():返回该LocationProvider的名称; boolean hasMonetaryCost():返回该LocationProvider是收费的还是免费的; boolean supportsAltitude():判断该LocationProvider是否支持高度信息; boolean supportsBearing():判断该LocationProvider是否支持方向信息; boolean supportsSpeed():判断该LocationProvider是否支持速度信息; Location类 就是代表位置信息的抽象类,通过Location可获取定位信息的精度、高度、方向、纬度、经度、速度以及该位置的LocationProvider等信息。
10.1.1支持位置服务的核心API LocationListener接口 用于监听定位信息的监听器,必须在定位管理器中注册该对象,这样在位置发生变化的时候就会触发相应的方法进行事件处理,该监听器包含的方法如下: public abstract void onLocationChanged (Location location):位置发生改变时回调该方法; public abstract void onProviderDisabled (String provider):Provider禁用时回调该方法; public abstract void onProviderEnabled (String provider):Provider启用时回调该方法; public abstract void onStatusChanged (String provider, int status, Bundle extras):当Provider状态发生变化时回调该方法;
10.1.2 简单位置服务应用 获取位置信息的通用步骤为: 案例:获取位置信息 【示例代码:codes\ch10\LocationTest】 ①获取系统的LocationManager对象; ②使用Locationmanager,通过指定LocationProvider来获取定位信息,定位信息由Location来对象来表示; ③从Location对象中获取定位信息; 案例:获取位置信息 【示例代码:codes\ch10\LocationTest】
10.2 百度地图编程 Android提供的位置服务API可获取设备的定位信息,但得到的只是一些难记的经纬度数值,对用户来说用处不大。如果能将这些经纬度与生活联系起来,以更形象直观的方式显示将会吸引更多的用户,最典型的就是地图应用。 百度地图 Android SDK是一套基于Android 2.1及以上版本设备的应用程序接口。 通过该套 SDK可以开发适用于Android系统移动设备的地图应用,可以轻松访问百度地图服务和数据,构建功能丰富、交互性强的地图类应用程序。
百度地图常见功能 地图:提供地图展示和地图操作功能,其中地图展示包括普通地图(2D,3D)、卫星图和实时交通图; POI检索:支持周边检索、区域检索和城市内检索。 地理编码:提供地理坐标和地址之间相互转换的能力。 线路规划:支持公交信息查询、公交换乘查询、驾车线路规划和步行路径检索。 地图覆盖物:百度地图SDK支持多种地图覆盖物,展示更丰富的地图。 定位:采用GPS、WIFI、基站、IP混合定位模式,可使用Android定位SDK获取定位信息,使用地图SDK定位图层进行位置展示。
10.2.1使用百度地图的准备工作 百度地图作为第三方应用,Android中并不能直接使用,需要导入百度地图提供给我们的SDK,具体准备工作如下: 1.申请百度地图API Key。
10.2.1使用Google地图的准备工作 2.下载百度地图SDK,单击相关下载,选择一键下载即可。
10.2.2在地图上标记位置 MapView:显示地图的控件,主要负责获取地图数据并显示,能够捕捉屏幕触控、手势等操作,根据用户操作实时更新地图数据的显示。在使用该控件之前要确保已调用SDKInitializer.initialize(Context)方法执行初始化操作,通过该控件可获取具体的地图对象。 BaiduMap:具体的百度地图对象,该类封装了地图对象的操作方法和接口,例如可为其添加各种事件监听器、设置地图显示的类型(普通图、卫星图)、改变地图状态(如缩放级别)、添加图层(如添加标记)等。
10.2.2在地图上标记位置 MapStatusUpdate:描述地图状态将要发生的变化,例如缩放级别的变化等; LatLng:地图上位置信息的封装,包括经度、纬度信息; Marker:标记,用于突出地图上某个位置或建筑物信息; MarkerOptions:用于设置标记的一些属性信息,例如标记的图标、标记的位置坐标、标记的标题、标记是否可拖动等;
10.2.2在地图上标记位置 应用中显示百度地图的开发步骤 (1)根据向导创建一个Android项目,导入百度地图SDK; (2)在AndroidManifest.xml文件中添加开发密钥、所需权限等信息; (3)在布局xml文件中添加地图控件; (4)在应用程序创建时初始化 SDK引用的Context 全局变量,初始化操作应放在加载布局文件之前; (5)管理MapView的生命周期,让其随着Activity的变化而变化。
10.2.2 根据位置信息在地图上定位 百度地图上显示位置标记 (1)为单选按钮添加切换模式事件处理,判断选中的是哪个模式,然后设置显示模式; (2)为定位按钮添加事件处理,首先获取用户输入的经纬度值,然后将其封装成LatLng对象,再根据坐标信息在地图上添加一个标记。