1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > Android集成百度定位 超详细 拒绝坑 附demo!!!

Android集成百度定位 超详细 拒绝坑 附demo!!!

时间:2024-04-20 15:05:03

相关推荐

Android集成百度定位 超详细 拒绝坑 附demo!!!

众所周知,百度地图作为定位,地图,导航界的大佬之一,我们的项目中有这方面的需求,百度地图集成也是个不错的选择。

百度地图集成成本极低,首先,它免费,官网文档清晰,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

即:<serviceandroid:name="com.baidu.location.f"android:enabled="true"android:process=":remote"/> 接着就是添加权限:即:

<!-- 这个权限用于进行网络定位--><uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission><!-- 这个权限用于访问GPS定位--><uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission><!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位--><uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"></uses-permission><!-- 获取运营商信息,用于支持提供运营商信息相关的接口--><uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission><!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--><uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"></uses-permission><!-- 用于读取手机当前的状态--><uses-permissionandroid:name="android.permission.READ_PHONE_STATE"></uses-permission><!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据--><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><!-- 访问网络,网络定位需要上网--><uses-permissionandroid:name="android.permission.INTERNET"/><!-- SD卡读取权限,用户写入离线定位数据--><uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>

最后就是设置之前说过的AK了:

即:

<meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="你的AK"/>

以上配置都是在AndroidManifest.xml中配置的。 3.开启定位: 在之前的配置完成后,现在就开始最关键的一步了,定位!!! 在这里,我新建了一个工具类,命名BDLocationUtils.java 里面还有个新建类,MyLocationListener.java,在下面会帖出来; BDLocationUtils.java

packagecom.demo.mybaidumapdemo;importandroid.content.Context;importcom.baidu.location.BDLocationListener;importcom.baidu.location.LocationClient;importcom.baidu.location.LocationClientOption;/*** Created by Jabez on /3/6.*/public classBDLocationUtils {publicContextcontext;publicLocationClientmLocationClient=null; //LocationClient类是定位SDK的核心类publicBDLocationListenermyListener=newMyLocationListener();publicBDLocationUtils(Context context){this.context= context;}public voiddoLocation(){//声明LocationClient类mLocationClient=newLocationClient(context.getApplicationContext());//注册监听函数mLocationClient.registerLocationListener(myListener);//初始化定位initLocation();}private voidinitLocation(){LocationClientOption option =newLocationClientOption();option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系intspan=1000;option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要option.setOpenGps(true);//可选,默认false,设置是否使用gpsoption.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

packagecom.demo.mybaidumapdemo;importandroid.util.Log;importcom.baidu.location.BDLocation;importcom.baidu.location.BDLocationListener;importcom.baidu.location.Poi;importjava.util.List;/*** Created by Jabez on /3/6.*/public classMyLocationListenerimplementsBDLocationListener {@Overridepublic voidonReceiveLocation(BDLocation location) {//获取定位结果StringBuffer sb =newStringBuffer(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@,会有人追查原因");}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();}@Overridepublic voidonConnectHotSpotMessage(String s,inti) { }}

Const.java

packagecom.demo.mybaidumapdemo;/*** Created by Jabez on /3/6.*/public classConst {public static doubleLONGITUDE= 0;//经度public static doubleLATITUDE= 0;//纬度public staticStringADDRESS="";//地址}

需要的类大概就这些,很简单的一个实例,那现在就来调用定位吧

布局中一个按钮,响应按钮点击事件进行定位

MainActivity.java

packagecom.demo.mybaidumapdemo;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;public classMainActivityextendsActivity {@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btn_start_location = (Button)findViewById(R.id.start_location);btn_start_location.setOnClickListener(newView.OnClickListener() {@Overridepublic voidonClick(View v) {BDLocationUtils bdLocationUtils =newBDLocationUtils(MainActivity.this);bdLocationUtils.doLocation();//开启定位 bdLocationUtils.mLocationClient.start();//开始定位}});}}

PS:最后别忘了在有网的状态下定位哈!

运行程序,打印结果如下:

数据一切正常!

Android集成百度定位demo

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。