Mars Android视频学习笔记——03_03/04_用户定位

地图的使用,一般包括两方面的基本知识:一是定位;二是显示地图和在地图上显示相应的图层,包括定位到的位置。

Mars老师在这两节中主要讲解了定位方面的;至于在地图上显示其它图层可参照转载的另一篇文章:

    一步步教你用Android Google Map


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 当中声明相应的权限;

  1. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATON"/>  

2、  获取 LocationManager 对象;

  1. //得到一个定位服务管理器   
  2.         locationManager = (LocationManager)LifeMap.this.getSystemService(Context.LOCATION_SERVICE);  

3、  选择 LocationProviders

  1. //选择LocationProviders并绑定监听器   
  2. //      locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, theLocationListener);   
  3.         locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 50000, theLocationListener);  

4、  绑定 LocationListener 对象。

  1. /**** 
  2.      * @功能:位置监听器 
  3.      ****/  
  4.     private class TheLocationListener implements LocationListener{  
  5.         public void onLocationChanged(Location arg0) {  
  6.             // TODO Auto-generated method stub   
  7.             GeoPoint point = new GeoPoint((int)(arg0.getLatitude()*1000000), (int)(arg0.getLongitude()*1000000));  
  8.             OverlayItem overlayitem =   
  9.                  new OverlayItem(point, "Hello""I'm in Athens, Greece!");  
  10.             mapController.animateTo(point);         //把当前位置当成中心点   
  11.             itemizedOverlay.addOverlay(overlayitem);  
  12.             System.out.println("Latitude is :"+(int)(arg0.getLatitude()*1000000) +"  the Longitude is "+(int)(arg0.getLongitude()*1000000));  
  13.         }  
  14.         public void onProviderDisabled(String provider) {  
  15.             // TODO Auto-generated method stub   
  16.               
  17.         }  
  18.         public void onProviderEnabled(String provider) {  
  19.             // TODO Auto-generated method stub   
  20.               
  21.         }  
  22.         public void onStatusChanged(String provider, int status, Bundle extras) {  
  23.             // TODO Auto-generated method stub   
  24.               
  25.         }  
  26.           
  27.     }  

 


既然定位有不同的 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显示的地图和手机自带的地图软件显示的地图都不一样的,也不知怎么回事!

在论坛也发过贴咨询:

地图开发遇到的怪异问题????

猜你喜欢

转载自blog.csdn.net/oMengHen1/article/details/21810181