高德地图 Android API 的基站定位原理及使用方法

基站定位是根据通讯网络基站信息进行定位的方法,此定位方法需要有较丰富的基站地理信息数据支持。高德地图目前的基站数据库支持 GSM 网络和CDMA网络。

定位机制

Android 平台主要使用三个 Class 和一个 interface 访问定位功能:

  1. LocationManager 是定位的核心接口,应用程序首先调用 getSystemService,得到此类的实例,然后通过此类向系统申请定位支持。
  2. 定位方法有多种,每一种都封装为一个LocationProvider 的子类,如 GPS 定位,Cell 定位,IP 定位等等。应用程序可以设定一个标准,让系统帮自己选择一个合适的LocationProvider,此标准的定义由类 Criteria 封装。
  3. 接口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定位。

 

posted on 2012-07-06 17:11  高德地图API博客  阅读(5334)  评论(0编辑  收藏  举报