众所周知,百度地图作为定位,地图,导航界的大佬之一,我们的项目中有这方面的需求,百度地图集成也是个不错的选择。
百度地图集成成本极低,首先,它免费,官网文档清晰,demo明确,但还是有很多人要才坑,正如我,在我集成百度地图的时候,坑也非常多,在这里,我将详述百度地图集成步骤。
直接上主题:
PS:此集成环境在Android studio中完成!
使用Eclipse的朋友差别并不大。
1.注册开发者账号:百度地图开放平台
注册完成之后,创建应用:
其中SHA1和包名如下图所示:
点击提交后:
到这里,基本上创建的应用就ok了,我们也拥有了应用的AK了(AK需要配置到我们的项目中去)
2.配置Android studio应用:
1)创建完成的应用:
2)配置环境:
下载官网下载SDK,下载百度定位SDK,下载后解压出来有如下文件
将其复制到项目的libs中,如下:
都是复制了许多不同架构的文件夹,适应各种架构机型。
之后别忘了将jar包添加进build.radle,Jar包右键->Add as library->确定
之后就是要配置build.gradle中配置lib,如下:
即:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
然后就是配置AndroidManifest.xml文件了,如下
在Application标签中声明SERVICE组件,每个APP拥有自己单独的定位SERVICE
即:
<
service
android
:name=
"com.baidu.location.f"
android
:enabled=
"true"
android
:process=
":remote"
/>
接着就是添加权限:
即:
<!-- 这个权限用于进行网络定位--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> <!-- 这个权限用于访问GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <!-- 获取运营商信息,用于支持提供运营商信息相关的接口--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--> <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" /> <!-- SD卡读取权限,用户写入离线定位数据--> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
最后就是设置之前说过的AK了:
即:
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="你的AK" />
以上配置都是在AndroidManifest.xml中配置的。
3.开启定位:
在之前的配置完成后,现在就开始最关键的一步了,定位!!!
在这里,我新建了一个工具类,命名BDLocationUtils.java
里面还有个新建类,MyLocationListener.java,在下面会帖出来;
BDLocationUtils.java
package com.demo.mybaidumapdemo; import android.content.Context; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; /** * Created by Jabez on 2017/3/6. */ public class BDLocationUtils { public Context context; public LocationClient mLocationClient = null; //LocationClient类是定位SDK的核心类 public BDLocationListener myListener = new MyLocationListener(); public BDLocationUtils(Context context){ this.context = context; } public void doLocation(){ //声明LocationClient类 mLocationClient = new LocationClient(context.getApplicationContext()); //注册监听函数 mLocationClient.registerLocationListener( myListener ); //初始化定位 initLocation(); } private void initLocation(){ LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备 option.setCoorType("bd09ll"); //可选,默认gcj02,设置返回的定位结果坐标系 int span=1000; option.setScanSpan(span); //可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的 option.setIsNeedAddress(true); //可选,设置是否需要地址信息,默认不需要 option.setOpenGps(true); //可选,默认false,设置是否使用gps option.setLocationNotify(true); //可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果 option.setIsNeedLocationDescribe(true); //可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近” option.setIsNeedLocationPoiList(true); //可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到 option.setIgnoreKillProcess(false); //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死 option.SetIgnoreCacheException(false); //可选,默认false,设置是否收集CRASH信息,默认收集 option.setEnableSimulateGps(false); //可选,默认false,设置是否需要过滤GPS仿真结果,默认需要 mLocationClient.setLocOption(option); } }
MyLocationListener.java
package com.demo.mybaidumapdemo; import android.util.Log; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.Poi; import java.util.List; /** * Created by Jabez on 2017/3/6. */ public class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { //获取定位结果 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){ // GPS定位结果 sb.append("\nspeed : "); sb.append(location.getSpeed()); // 单位:公里每小时 sb.append("\nsatellite : "); sb.append(location.getSatelliteNumber()); //获取卫星数 sb.append("\nheight : "); sb.append(location.getAltitude()); //获取海拔高度信息,单位米 sb.append("\ndirection : "); sb.append(location.getDirection()); //获取方向信息,单位度 sb.append("\naddr : "); sb.append(location.getAddrStr()); //获取地址信息 sb.append("\ndescribe : "); sb.append("gps定位成功"); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){ // 网络定位结果 sb.append("\naddr : "); sb.append(location.getAddrStr()); //获取地址信息 sb.append("\noperationers : "); sb.append(location.getOperators()); //获取运营商信息 sb.append("\ndescribe : "); sb.append("网络定位成功"); } else if (location.getLocType() == BDLocation.TypeOffLineLocation) { // 离线定位结果 sb.append("\ndescribe : "); sb.append("离线定位成功,离线定位结果也是有效的"); } else if (location.getLocType() == BDLocation.TypeServerError) { sb.append("\ndescribe : "); sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因"); } else if (location.getLocType() == BDLocation.TypeNetWorkException) { sb.append("\ndescribe : "); sb.append("网络不同导致定位失败,请检查网络是否通畅"); } else if (location.getLocType() == BDLocation.TypeCriteriaException) { sb.append("\ndescribe : "); sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机"); } sb.append("\nlocationdescribe : "); sb.append(location.getLocationDescribe()); //位置语义化信息 List<Poi> list = location.getPoiList(); // POI数据 if (list != null) { sb.append("\npoilist size = : "); sb.append(list.size()); for (Poi p : list) { sb.append("\npoi= : "); sb.append(p.getId() + " " + p.getName() + " " + p.getRank()); } } Log.i("BaiduLocationApiDem", sb.toString()); //现在已经定位成功,可以将定位的数据保存下来,这里我新建的一个Const类,保存全局静态变量 Const.LONGITUDE = location.getLongitude(); Const.LATITUDE = location.getLatitude(); Const.ADDRESS = location.getAddrStr(); } @Override public void onConnectHotSpotMessage(String s, int i) { } }
Const.java
package com.demo.mybaidumapdemo; /** * Created by Jabez on 2017/3/6. */ public class Const { public static double LONGITUDE = 0;//经度 public static double LATITUDE = 0;//纬度 public static String ADDRESS = "";//地址 }
需要的类大概就这些,很简单的一个实例,那现在就来调用定位吧
布局中一个按钮,响应按钮点击事件进行定位
MainActivity.java
package com.demo.mybaidumapdemo; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn_start_location = (Button)findViewById(R.id.start_location); btn_start_location.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { BDLocationUtils bdLocationUtils = new BDLocationUtils(MainActivity.this); bdLocationUtils.doLocation();//开启定位 bdLocationUtils.mLocationClient.start();//开始定位 } }); } }PS:最后别忘了在有网的状态下定位哈!
运行程序,打印结果如下:
数据一切正常!