地图的使用,一般包括两方面的基本知识:一是定位;二是显示地图和在地图上显示相应的图层,包括定位到的位置。
Mars老师在这两节中主要讲解了定位方面的;至于在地图上显示其它图层可参照转载的另一篇文章:
Android 中的定位,主要涉及到两个重要的 API : Location Manager 和 Location Providers 。
Location Manager 是用于管理 Android 的用户定位服务 ;
Location Providers 则是提供了多种定位方式供开发者选择,主要包括 GPS 、 NETWORK 和 PASSIVE 。
其中前两者是较为常用,最后一种我也不太清楚是什么方式。
如果要使用 GPS 定位,则需要声明 android.permission.ACCESS_FINE_LOCATION 权限;
如果需要使用 NETWORK 定位,则需要声明 android.permission.ACCESS_FINE_LOCATION 权限或 android.permission.ACCESS_COARSE_LOCATION 权限。
需要进行定位,一般需要通过以下四个步骤:
1、 在 AndroidManifest.xml 当中声明相应的权限;
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATON"/>
2、 获取 LocationManager 对象;
//得到一个定位服务管理器 locationManager = (LocationManager)LifeMap.this.getSystemService(Context.LOCATION_SERVICE);
3、 选择 LocationProviders ;
//选择LocationProviders并绑定监听器 // locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, theLocationListener); locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 0, theLocationListener);
4、 绑定 LocationListener 对象。
/**** * @功能:位置监听器 ****/ private class TheLocationListener implements LocationListener{ public void onLocationChanged(Location arg0) { // TODO Auto-generated method stub GeoPoint point = new GeoPoint((int)(arg0.getLatitude()*1000000), (int)(arg0.getLongitude()*1000000)); OverlayItem overlayitem = new OverlayItem(point, "Hello", "I'm in Athens, Greece!"); mapController.animateTo(point); //把当前位置当成中心点 itemizedOverlay.addOverlay(overlayitem); System.out.println("Latitude is :"+(int)(arg0.getLatitude()*1000000) +" the Longitude is "+(int)(arg0.getLongitude()*1000000)); } public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } }
既然定位有不同的 Providers ,那什么样的 Providers 对于我们来说是最合适的呢,这个就见仁见智了,得根据你自己的要求,然后再找出一个最为符合你的要求的 Providers 。 Android 中在 android.location
包中提供了一个类 Criteria ,其中有很方法用于设置我们需要的条件:
setAccuracy (int accuracy) :设置精度,参数为 ACCURACY_COARSE 或 ACCURACY_FINE ;
setAltitudeRequired (boolean altitudeRequired) :是否需要海拔信息,参数为: true 或 false ;
setBearingAccuracy (int accuracy) :设置方向的精度,参数为: ACCURACY_HIGH 或 ACCURACY_LOW ;
setBearingRequired (boolean bearingRequired) :是否需要方向信息,参数为: true 或 false ;
setCostAllowed (boolean costAllowed) :是否产生费用,如流量费用等等,参数为: true 或 false ;
setHorizontalAccuracy (int accuracy) :设置水平方向的精度,参数为: ACCURACY_HIGH 或 ACCURACY_LOW 或 ACCURACY_MEDIUM ;
setPowerRequirement (int level) :设置电量的消耗,参数为 NO_REQUIREMENT, POWER_LOW, POWER_MEDIUM, 或 POWER_HIGH ;
setSpeedAccuracy (int accuracy) :设置速度的精度,其参数为: ACCURACY_LOW , ACCURACY_HIGH , 或 NO_REQUIREMENT ;
setSpeedRequired (boolean speedRequired) : 是否需要速度信息,参数为: true 或 false ;
setVerticalAccuracy (int accuracy) :垂直方向的精度,参数为: ACCURACY_LOW , ACCURACY_MEDIUM , ACCURACY_HIGH 或 NO_REQUIREMENT 。
设置好这个 Criteria 对象后,就可以通过 LocationManager 的 getBestProvider (Criteria criteria, boolean enabledOnly) 方向传入刚设置好的 Criteria 对象,以及一个布尔值,则可得到一个最合适的 Provider 。
注: enabledOnly 如果为 false 时,则在所有 Provider 中查找最合适的 Provider ;
enabledOnly 如果为 true 时,则只在当前打开可用的 Provider 中查找最合适的 Provider 。
由于天朝的地图都有偏移量,所以定位后在地图上看到不准,不用慌,改成用卫星图看就可以确定是否定位准了。
我自己打开WIFI然后用 NETWORK 定位时,发现和打开3G进行 NETWORK 定位得到的结果不同,3G的很不准确,WIFI基本准确。目前尚不知道是怎么回事。还有就是发现用MAPVIEW显示的地图和手机自带的地图软件显示的地图都不一样的,也不知怎么回事!
在论坛也发过贴咨询: