Android定位功能(二)
2012-05-29 15:29
411 查看
已经大致介绍了一下在Android平台中,和定位功能相关的类,并举例获取了位置信息。但是前文是基于Criteria定制了一个标准,通过getBestProvider()方法由Android系统自动获取最符合Criteria的LocationProvider,从而实现了定位功能。这样的做法能最大限度的保证定位功能的可实现性,但是却无法保证获取到的位置信息有最大的准确度。因为除了GPS外,其他定位方式都或多或少存在着位置偏移。
在实现GPS定位前,先了解一下GPS的部分特性:
1. GPS定位需要依靠3颗或3颗以上的卫星。
2. GPS定位受环境影响较大,在晴朗的空地上,较容易搜索到卫星,而在室内通常是无法搜索到卫星的。
3. GPS定位需要使用GPS功能模块,而GPS功能模块的耗电量是巨大的。
在Android系统中,实现GPS定位的思路应该是:
1. 获取GPS的Location Provider。
2. 讲此Provider传入到requestLocationUpdates()方法,让Android系统获知搜索位置方式。
3. 创建实现了GpsStatus.Listener接口的对象,重写onGpsStatusChanged()方法,向LocationManager添加次监听器,检测卫星状态。(可选步骤)
根据以上思路,仿照Android定位功能(一)中的例子,可以很容易的得到以下实现代码:(此代码的实现前提是GPS功能模块处于打开状态)
通过以上代码中的注释部分,可以清晰的知道Android定位功能里相关方法的具体含义。希望对大家有用。
另外,因为GPS的自身特性,此代码在室内几乎无法定位,所以建议再真正的实际项目里,至少使用network和GPS两种不同的Location Provider实现定位功能。
在实现GPS定位前,先了解一下GPS的部分特性:
1. GPS定位需要依靠3颗或3颗以上的卫星。
2. GPS定位受环境影响较大,在晴朗的空地上,较容易搜索到卫星,而在室内通常是无法搜索到卫星的。
3. GPS定位需要使用GPS功能模块,而GPS功能模块的耗电量是巨大的。
在Android系统中,实现GPS定位的思路应该是:
1. 获取GPS的Location Provider。
2. 讲此Provider传入到requestLocationUpdates()方法,让Android系统获知搜索位置方式。
3. 创建实现了GpsStatus.Listener接口的对象,重写onGpsStatusChanged()方法,向LocationManager添加次监听器,检测卫星状态。(可选步骤)
根据以上思路,仿照Android定位功能(一)中的例子,可以很容易的得到以下实现代码:(此代码的实现前提是GPS功能模块处于打开状态)
publicclass MainActivity extends Activity { private LocationManager locationManager; private GpsStatus gpsstatus; @Override publicvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //获取到LocationManager对象 locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); //根据设置的Criteria对象,获取最符合此标准的provider对象 String currentProvider = locationManager.getProvider(LocationManager.GPS_PROVIDER).getName(); //根据当前provider对象获取最后一次位置信息 Location currentLocation = locationManager.getLastKnownLocation(currentProvider); //如果位置信息为null,则请求更新位置信息 if(currentLocation ==null){ locationManager.requestLocationUpdates(currentProvider, 0, 0, locationListener); } //增加GPS状态监听器 locationManager.addGpsStatusListener(gpsListener); //直到获得最后一次位置信息为止,如果未获得最后一次位置信息,则显示默认经纬度 //每隔10秒获取一次位置信息 while(true){ currentLocation = locationManager.getLastKnownLocation(currentProvider); if(currentLocation !=null){ Log.d("Location", "Latitude: "+ currentLocation.getLatitude()); Log.d("Location", "location: "+ currentLocation.getLongitude()); break; }else{ Log.d("Location", "Latitude: "+0); Log.d("Location", "location: "+0); } try { Thread.sleep(10000); } catch (InterruptedException e) { Log.e("Location", e.getMessage()); } } } private GpsStatus.Listener gpsListener =new GpsStatus.Listener(){ //GPS状态发生变化时触发 @Override publicvoid onGpsStatusChanged(int event) { //获取当前状态 gpsstatus=locationManager.getGpsStatus(null); switch(event){ //第一次定位时的事件 case GpsStatus.GPS_EVENT_FIRST_FIX: break; //开始定位的事件 case GpsStatus.GPS_EVENT_STARTED: break; //发送GPS卫星状态事件 case GpsStatus.GPS_EVENT_SATELLITE_STATUS: Toast.makeText(MainActivity.this, "GPS_EVENT_SATELLITE_STATUS", Toast.LENGTH_SHORT).show(); Iterable<GpsSatellite> allSatellites = gpsstatus.getSatellites(); Iterator<GpsSatellite> it=allSatellites.iterator(); int count =0; while(it.hasNext()) { count++; } Toast.makeText(MainActivity.this, "Satellite Count:"+ count, Toast.LENGTH_SHORT).show(); break; //停止定位事件 case GpsStatus.GPS_EVENT_STOPPED: Log.d("Location", "GPS_EVENT_STOPPED"); break; } } }; //创建位置监听器 private LocationListener locationListener =new LocationListener(){ //位置发生改变时调用 @Override publicvoid onLocationChanged(Location location) { Log.d("Location", "onLocationChanged"); } //provider失效时调用 @Override publicvoid onProviderDisabled(String provider) { Log.d("Location", "onProviderDisabled"); } //provider启用时调用 @Override publicvoid onProviderEnabled(String provider) { Log.d("Location", "onProviderEnabled"); } //状态改变时调用 @Override publicvoid onStatusChanged(String provider, int status, Bundle extras) { Log.d("Location", "onStatusChanged"); } }; }
通过以上代码中的注释部分,可以清晰的知道Android定位功能里相关方法的具体含义。希望对大家有用。
另外,因为GPS的自身特性,此代码在室内几乎无法定位,所以建议再真正的实际项目里,至少使用network和GPS两种不同的Location Provider实现定位功能。
相关文章推荐
- Android仿微信朋友圈点击评论自动定位到相关行功能
- Android 高德地图的定位功能,以及动态开启权限
- Android百度地图+定位功能
- Android 高德地图定位功能的实现步骤
- Android基于百度定位SDK v4.1(LBS)实现定位功能
- Android 百度地图开发(二)--- 定位功能之MyLocationOverlay,PopupOverlay的使用
- Android定位功能
- Android定位功能(二)
- Android 实现地理定位功能
- Android使用百度地图SDK实现定位功能
- Android中级篇之百度地图SDK v3.5.0-一步一步带你仿各大主流APP地图定位移动选址功能
- Android中高德地图定位功能的实现
- android+高德地图实现基本地图和基本定位功能
- Android定位功能(一)
- 脚本控制向Android模拟拨打电话,发送短信,定位设置功能
- Android 的网络编程(11)-Android定位功能
- android中高德地图定位功能并且获取定位的城市
- android定位功能1
- Android--百度地图定位功能的具体实现<百度地图SDK版本 v3.7.3>
- android高德地图自定义定位图标并具有类似陀螺仪旋转功能。