这里使用讲解的是androidStudio下开发android应用,实现百度地图定位功能的辅助教程。
登入百度地图API官方网站http://lbsyun.baidu.com/
在主页中选择开发->Android定位sdk,我们可以看到有很多的教程,包括教你获取秘钥,开发指南等等。具体我就不再赘述了,可以看上面的开发指南,这篇文章主要针对app中加入百度定位的一些细节方面的操作。
接着选择相关下载->全部下载,进入之后可以看到如下界面。我们这里只勾选全量定位即可。
点击下载开发包,当然你也可以下载示例代码和参考类。
下载好开发包之后可以解压看到如下目录结构:
有可能你会问这些是干嘛用的,其实这些都是动态链接库,针对不同架构的android手机cpu百度编写了不同的库文件,目的是为了适配不同的CPU架构,如果你选择了多个功能的开发包,会发现非常大,这时我们就得取舍,我们只要留下armeabi和 armeabi-v7a 这两文件的库就行了,基本上市面机子都ok。
知识提示:
armeabi就是针对普通的或旧的arm v5 cpu,armeabi-v7a是针对有浮点运算或高级扩展功能的arm v7 cpu。
armeabi-v7a(32位ARM设备),arm64-v8a(64位ARM设备)。
对于.so文件放哪,你可能会感到困惑,如下总结:
- AndroidStudio工程放在jniLibs/ABI目录中(当然也可以通过在build.gradle文件中的设置jniLibs.srcDir属性自己指定);
- Eclipse工程放在libs/ABI目录中(这也是ndk-build命令默认生成.so文件的目录);
- AAR压缩包中位于jni/ABI目录中(.so文件会自动包含到引用AAR压缩包的APK中);
- 最终在APK文件中的lib/ABI目录中
通过PackageManager安装后,在小于Android 5.0的系统中,.so文件位于app的nativeLibraryPath目录中;在大于等于Android 5.0的系统中,.so文件位于app的nativeLibraryRootDir/CPU_ARCH目录中。
接下来是将这些库文件以及jar包导入到android工程中,如下操作,这里就将百度地图的动态链接库全部导入到应用中吧,全部复制粘贴到libs目录下:
将jar包选择右键,Add As Library,这样成功将jar包导入,图中没有显示库文件,是因为楼主截图不是同一个工程导致。正常将会显示出库文件,请谅解。
当然你也可以通过Project Structure的方式将jar包导入,如下操作:
完成jar包的导入,可以看到在android工程的Gradle(Module:app)文件中看到如下的描述,这意味着,您的jar包导入成功了。
下面是导入后的libs目录结构:
由于百度地图定位需要用到动态链接库,我们需要在Gradle(Module:app)文件中添加如下代码:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
还需要在Manifests文件中声明服务以及配置秘钥,如下:
对了,别忘了还要声明一些权限,详情请看官方开发指南
好了这样百度地图定位的准备工作就基本做好了。现在你就可以看百度的图的开发指南,进行代码的编写
官方开发指南地址:http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/getloc
作者在做自己项目时写了个工具类,方便操作:
public class BDLocationUtils implements BDLocationListener {
private static BDLocationUtils bdLocationUtils;
public LocationClient mLocationClient = null;
private String describe = "";
private List<Poi> locationPoiList = new ArrayList<>();
private List<String> locationList = new ArrayList<>();
private String address;
public static BDLocationUtils newInstance(Context context) {
if (bdLocationUtils == null) {
bdLocationUtils = new BDLocationUtils(context);
}
return bdLocationUtils;
}
public BDLocationUtils(Context context) {
System.out.println("bdlocation");
mLocationClient = new LocationClient(context); //声明LocationClient类
initLocation();
mLocationClient.registerLocationListener(this); //注册监听函数
mLocationClient.start();
}
/**
* 初始化位置获取设置
*/
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(false);//可选,默认false,设置是否使用gps
option.setLocationNotify(false);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
option.setIsNeedLocationDescribe(false);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
option.setEnableSimulateGps(true);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要
mLocationClient.setLocOption(option);
}
@Override
public void onReceiveLocation(BDLocation location) {
System.out.println("bdlocation listener。");
//Receive 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());
//latitude = location.getLatitude();
MyApplication.location.setLatitude(location.getLatitude());//纬度
sb.append("\nlontitude : ");
sb.append(location.getLongitude());//经度
MyApplication.location.setLatitude(location.getLongitude());
//longitude = 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());
address = location.getAddrStr();
MyApplication.location.setAddress(address);
sb.append(address);
//Log.i("address:", address);
sb.append("\ndescribe : ");
sb.append("gps定位成功");
describe = "gps定位成功";
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果
sb.append("\naddr : ");
address = location.getAddrStr();
sb.append(address);
MyApplication.location.setAddress(address);
//运营商信息
sb.append("\noperationers : ");
sb.append(location.getOperators());
sb.append("\ndescribe : ");
sb.append("网络定位成功");
describe = "网络定位成功";
} else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
sb.append("\ndescribe : ");
sb.append("离线定位成功,离线定位结果也是有效的");
describe = "离线定位成功,离线定位结果也是有效的";
} else if (location.getLocType() == BDLocation.TypeServerError) {
sb.append("\ndescribe : ");
sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");
describe = "服务端网络定位失败";
} else if (location.getLocType() == BDLocation.TypeNetWorkException) {
sb.append("\ndescribe : ");
sb.append("网络不同导致定位失败,请检查网络是否通畅");
describe = "服务端网络定位失败";
} else if (location.getLocType() == BDLocation.TypeCriteriaException) {
sb.append("\ndescribe : ");
sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
describe = "无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机";
}
sb.append("\nlocationdescribe : ");
sb.append(location.getLocationDescribe());// 位置语义化信息
locationPoiList = location.getPoiList();// POI数据
if (locationPoiList != null) {
sb.append("\npoilist size = : ");
sb.append(locationPoiList.size());
locationList.clear();
for (Poi p : locationPoiList) {
sb.append("\npoi= : ");
sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
locationList.add(p.getName());
}
//通知list数据更新
}
//提示定位结果
Log.i("BaiduLocationApiDem", sb.toString());
}
public void startLocation() {
mLocationClient.start();
}
public void stopLocation() {
mLocationClient.stop();
}
public List<String> getLocationList() {
return locationList;
}
public String getAddress() {
return address;
}
public String getDescribe() {
return describe;
}
}
获取您当前位置可能的地点:
bdLocationUtils = BDLocationUtils.newInstance(getApplicationContext());
bdLocationUtils.startLocation();
locationList = bdLocationUtils.getLocationList();
locationList存放着可能得地点
下面是获取您当前位置的地点,属于一个范围地点,但不是具体的
bdLocationUtils.getAddress()
当你定位失败的时候,你肯定想有提示一下,那么可以调用如下代码
String describe = bdLocationUtils.getDescribe();
这样,describe就有你想要的信息。
注意,在你的activity中,finish时别忘了调用一下
bdLocationUtils.stopLocation();
以防止内存泄露。
如有问题,请留下您的脚印谢谢。
、
本文介绍如何在Android应用中集成百度地图定位功能。主要内容包括:获取百度地图API秘钥、下载定位SDK、导入库文件及jar包、配置Gradle文件、声明权限等步骤。并提供了一个工具类示例用于简化定位操作。

1283

被折叠的 条评论
为什么被折叠?



