Android-百度定位API使用方法

百度定位API使用方法

导入库文件

在下载页面下载最新的库文件。将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个方法需要实现:

  1. 接收异步返回的的定位结果,参数是BDLocation类型参数。

  2. 接收异步返回的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();   
}      
}

到这里就可以显示地图了,但是没有定位。


Android使用百度LBS SDK--定位实现

分别声明一个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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容