导入库文件
在下载页面下载最新的库文件。将liblocSDK2.4.so文件拷贝到libs/armeabi目录下。将locSDK2.4.jar文件拷贝到工程根目录下(libs根目录下),并在工程属性->Java Build Path->Libraries中选中“Add JARs”,选定locSDK2.4.jar.确定后返回。这样您就可以在程序中使用百度定位API了。
设置AndroidManifest.xml
为区分2.3版本service,需要将manifest file中的intent filter声明为com.baidu.location.service_v2.4在application标签中声明service组件。
<Service android:name = "com.baidu.location.f" andrdoid:enabled = "true" android:process = ":remote"
android:permission = "android.permission.BAIDU_LOCATION_SERVICE">
<intent-filter>
<action android:name = "com.baidu.location.service_v2.4">
</action>
</intent-filter>
</service>
声明使用权限
<permission android:name = "android.permission.BAIDU_LOCATION_SERVICE"></permission>
<uses-permission android:name = "android.permission.BAIDU_LOCATION_SERVICE"></uses-permission>
<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.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name = "android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
import相关类
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.BDNotifyListener;//假如用到位置提醒功能,需要import该类
功能类的使用
初始化LocationClient类
此处需要注意:LocationClient类必须在主线程中声明。需要Context类型的参数。
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();
public void onCreate() {
mLocationClient = new LocationClient(this); //声明LocationClient类
mLocationClient.registerLocationListener(myListener);//注册监听函数
}
实现BDLocationListener接口
BDLocationListener接口有2个方法需要实现:
接收异步返回的的定位结果,参数是BDLocation类型参数。
-
接收异步返回的POI查询结果,参数是BDLocation类型参数。
public class MyLocationListener implements BDLocationListener{ @override public void onReceiveLocation(BDLocation location) { if(location == null) return; StringBuffer sb = new StringBuffer(256); sb.append("time:"); sb.append(location.getTime()); sb.append("\nerror code:"); sb.append(location.getLocType()); sb.append("\nlatitude : "); sb.append(location.getLatitude()); sb.append("\nlontitude : "); sb.append(location.getLongitude()); sb.append("\nradius : "); sb.append(location.getRadius()); if (location.getLocType() == BDLocation.TypeGpsLocation){ sb.append("\nspeed : "); sb.append(location.getSpeed()); sb.append("\nsatellite : "); sb.append(location.getSatelliteNumber()); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){ sb.append("\naddr : "); sb.append(location.getAddrStr()); } logMsg(sb.toString()); } public void onReceivePoi(BDLocation poiLocation) { if (poiLocation == null){ return ; } StringBuffer sb = new StringBuffer (256); sb.append("Poi time : "); sb.append(poiLocation.getTime()); sb.append("\nerror code : "); sb.append(poiLocation.getLocType()); sb.append("\nlatitude : "); sb.append(poiLocation.getLatitude()); sb.append("\nlontitude : "); sb.append(poiLocation.getLongitude()); sb.append("\nradius : "); sb.append(poiLocation.getRadius()); if (poiLocation.getLocType() == BDLocation.TypeNetWorkLocation){ sb.append("\naddr : "); sb.append(poiLocation.getAddrStr()); } if(poiLocation.hasPoi()){ sb.append("\nPoi:"); sb.append(poiLocation.getPoi()); }else{ sb.append("noPoi information"); } logMsg(sb.toString()); }
设置参数
设置定位参数包括:定位模式(单次定位;定时定位),返回坐标类型,是否打开GPS等待。
eg:
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);
option.setAddrType("detail");
option.setCoorType("gcj02");
option.setScanSpan(5000);
option.disableCache(true);//禁止启用缓存定位
option.setPoiNumber(5); //最多返回POI个数
option.setPoiDistance(1000); //poi查询距离
option.setPoiExtraInfo(true); //是否需要POI的电话和地址等详细信息
mLocClient.setLocOption(option);
发起定位请求
发起定位请求。请求过程是异步的,定位结果在上面的监听函数onReceiveLocation中获取。
if (mLocClient != null && mLocClient.isStarted())
mLocClient.requestLocation();
else
Log.d("LocSDK_2.0_Demo1", "locClient is null or not started");
发起POI请求
发起POI查询请求。请求过程是异步的,定位结果在上面的监听函数onReceiverPoi中后去。
if (mLocClient != null && mLocClient.isStarted())
mLocClient.requestPoi();
位置提醒使用
位置提醒最多提醒3次,3次过后将不再提醒。 假如需要再次提醒,或者要修改提醒点坐标,都可通过函数SetNotifyLocation()来实现。
//位置提醒相关代码
mNotifyer = new NotifyLister();
mNotifyer.SetNotifyLocation(42.03249652949337,113.3129895882556,3000,"gps");//4个参数代表要位置提醒的点的坐标,具体含义依次为:纬度,经度,距离范围,坐标系类型(gcj02,gps,bd09,bd09ll)
mLocationClient.registerNotify(mNotifyer);
//注册位置提醒监听事件后,可以通过SetNotifyLocation 来修改位置提醒设置,修改后立刻生效。
//BDNotifyListner实现
public class NotifyLister extends BDNotifyListener{
public void onNotify(BDLocation mlocation, float distance){
mVibrator01.vibrate(1000);//振动提醒已到设定位置附近
}
}
//取消位置提醒
mLocationClient.removeNotifyEvent(mNotifyer);
核心类
LocationClient类
用来发起定位,添加取消监听
LocationClientOption类
用来设置定位方式,包括是否启用缓存,使用GPS,时间间隔等。
BDLocation类
定位结果的封装,包含坐标信息和错误代码等信息。
BDLocationListener接口类
获取定位结果
BDNotifyListener类
作用:位置提醒接口类,用于设置位置提醒点,以及实现监听函数。这个应该是适用于地图。
使用方法:
定位是以service方式在运行,所以需要在manifest.xml中声明service组件。
声明权限
MapView显示地图(百度API)
添加相关文档
在application中添加开发秘钥
<application>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="开发者 key" />
</application>
添加所需权限
布局
<com.baidu.mapapi.map.MapView
android:id = "@id/bmapView"
android:layout_width="fill_parent"
android:layout_height = "fill_parent"
android:clickable="true"
/>
在应用程序创建时初始化SDK引用的Context全局变量:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各组件之前初始化context信息,传入
ApplicationContext //注意该方法要再
setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
}
}
管理地图生命周期
public class MainActivity extends Activity
MapView mMapView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
//获取地图控件引用
mMapView = (MapView)
findViewById(R.id.bmapView);
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
}
到这里就可以显示地图了,但是没有定位。
分别声明一个MapView和BaiduMap:
private MapView mMapView;
private BaiduMap mBaiduMap;
在setContentView之前要初始化SDK
SDKInitializer.initialize(getApplication());
更换定位图标的方法
mCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo); // 自定义图标
// mCurrentMarker =null ; // 默认图标
mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker));
定位模式:
private LocationMode mCurrentMode;
mCurrentMode = LocationMode.NORMAL;//普通模式
//mCurrentMode = LocationMode.FOLLOWING;//跟随模式
//mCurrentMode = LocationMode.COMPASS;//罗盘模式
mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker));
初始化:
//地图初始化
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);
// 定位初始化
mLocClient = new LocationClient(this);
mLocClient.registerLocationListener(myListener);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);// 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(5000);
mLocClient.setLocOption(option);
mLocClient.start();
setScanSpan是定位时间间隔(ms),
setCoorType坐标类型分为三种:
bd09ll百度加密经纬度坐标
bd09百度加密墨卡托坐标
gcj02国测局加密经纬度坐标
定位SDK监听函数
public class MyLocationListener implements BDLocationListener{
@Override
public void onReceiveLocation(BDLocation location){
if(location ==null||mMapView = null)
return;
MylocationData = locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360 .direction(100).latitude(location.getLatitude()) .longitude(location.getLongitude()).build(); mBaiduMap.setMyLocationData(locData);
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.animateMapStatus(u);
}
}
public void onReceivePoi(BDLocation poiLocation) {
}
}
参考
Android使用百度LBS SDK(一)显示地图MapView
http://blog.csdn.net/zhoumushui/article/details/41751259?utm_source=tuicool&utm_medium=referral