基站定位是根据通讯网络基站信息进行定位的方法,此定位方法需要有较丰富的基站地理信息数据支持。高德地图目前的基站数据库支持 GSM 网络和CDMA网络。
定位机制
Android 平台主要使用三个 Class 和一个 interface 访问定位功能:
- LocationManager 是定位的核心接口,应用程序首先调用 getSystemService,得到此类的实例,然后通过此类向系统申请定位支持。
- 定位方法有多种,每一种都封装为一个LocationProvider 的子类,如 GPS 定位,Cell 定位,IP 定位等等。应用程序可以设定一个标准,让系统帮自己选择一个合适的LocationProvider,此标准的定义由类 Criteria 封装。
- 接口LocationListener 定义了回调方法,由应用程序实现。当回调条件触发时(比如,当前位置发生了改变),系统会调用此接口中的对应方法。
此三个类加一个接口为 Android 定位的基石,至于接口 GpsStatus.NmeaListener,GpsStatus.Listener,以及类 GpsStatus,GpsSatellite 仅与 GPS 定位相关。
高德地图Android API移动定位直接使用了类Criteria,以及接口LocationListener,使用两个Proxy:LocationManagerProxy 和 LocationProviderProxy分别重载了LocationManager 及 LocationProvider。这两个Proxy包含的方法及常量定义,与对应的标准类基本一致(LocationManager 的构造方法除外)。应用程序通过使用API,可以无缝的在基站定位,WiFi 定位及GPS定位间切换,定位过程如下图所示:
注意使用Cell定位的应用,需要添加权限 READ_PHONE_STATE 和 ACCESS_COARSE_LOCATION。
移动定位开发步骤
移动定位API在高德地图Android API 中主要使用LocationManagerProxy 类、 Criteria 类和一个LocationListener 接口来实现定位功能。下面介绍移动定位的具体使用方法:
第一步,导入库文件
右击工程名选择Build Path>Configure Build Path…>libraries,单击对话框右侧的“Add Externel JARs…”,选定MapApi.jar。在Android V2.2 或更早版本中,还需要在Order and Export 中选中对应的MapApi.jar,确定后返回,这样用户就可以在自己的程序中使用高德地图Android API 了。
第二步,设置使用权限
必须在manifest.xml 中设置网络定位服务的使用权限
<!-- 定位相关权限 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> |
第三步,Import 定位相关类
import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import com.amap.mapapi.location.LocationManagerProxy; |
第四步,定位类的实现
声明一个LocationManagerProxy对象locationManager ,在onCreate函数中初始化此LocationManagerProxy 对象locationManager。
private LocationManagerProxy locationManager = null; //声明LocationManagerProxy … locationManager = LocationManagerProxy.getInstance(this); //初始化LocationManagerProxy |
初始化一个Criteria 对象,设置相关参数,此对象自动匹配最适合的定位类型。调用enableMyLocation函数启动定位模块,disableMyLocation 函数关闭定位模块。
//根据Criteria 对象获取提供位置信息的provider,并启动定位模块 public boolean enableMyLocation() {
boolean result = true; Criteria cri = new Criteria(); cri.setAccuracy(Criteria.ACCURACY_COARSE); cri.setAltitudeRequired(false); cri.setBearingRequired(false); cri.setCostAllowed(false); String bestProvider = locationManager.getBestProvider(cri, true); locationManager.requestLocationUpdates(bestProvider, 2000, 10, this); return result; } // 关闭定位模块 public void disableMyLocation() { locationManager.removeUpdates(this);
locationManager =null; }
|
实现LocationListener 接口,用来监听定位信息,获取定位的经纬度坐标,在TextView 中显示。
private TextView myLocation; //显示经纬度字符串的文本视图
Handler handler = new Handler() //接收消息 { public void handleMessage(Message msg) { myLocation.setText((String)msg.obj); } };
public class LocationManager_Demo extends Activity implements LocationListener {
//LocationListener 的监听接口 @Override public void onLocationChanged(Location location) { // TODO Auto-generated method stub if (location != null) { Double geoLat = location.getLatitude(); Double geoLng = location.getLongitude(); String str =("定位成功:(" + geoLng + "," + geoLat + ")"); Message msg = new Message(); msg.obj=str; if(handler!=null) handler.sendMessage(msg);
} } }
|
具体示例代码,请参照网站的Android相关下载示例代码的location定位。