由于在百度地图使用的过程中遇到各种问题,这里简单整理一下。
1.地图定位集成
导入库文件
在下载页面下载最新的库文件。将liblocSDK2.4.so文件拷贝到libs/armeabi目录下。将locSDK2.4.jar文件拷贝到工程根目录下,并在工程属性->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组件
-
android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"
-
android:permission="android.permission.BAIDU_LOCATION_SERVICE">
-
-
android:name="com.baidu.location.service_v2.4">
-
-
声明使用权限
-
android:name="android.permission.BAIDU_LOCATION_SERVICE">
-
android:name="android.permission.BAIDU_LOCATION_SERVICE">
-
android:name="android.permission.ACCESS_COARSE_LOCATION">
-
android:name="android.permission.ACCESS_FINE_LOCATION">
-
android:name="android.permission.ACCESS_WIFI_STATE">
-
android:name="android.permission.ACCESS_NETWORK_STATE">
-
android:name="android.permission.CHANGE_WIFI_STATE">
-
android:name="android.permission.READ_PHONE_STATE">
-
android:name="android.permission.WRITE_EXTERNAL_STORAGE">
-
android:name="android.permission.INTERNET" />
-
android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS">
-
android:name="android.permission.READ_LOGS">
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 MyLocationListenner
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查询请求。请求过程是异步的,定位结果在上面的监听函数onReceivePoi中获取。
-
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
)
;
2.集成时报错:
(1) No implementation found for int com.baidu.platform.comjni.tools.JNITools.initClass(java.lang.Object, int) (tried Java_com_baidu_platform_comjni_tools_JNITools_initClass and Java_com_baidu_platform_comjni_tools_JNITools_initClass__Ljava_lang_Object_2I)
这个问题 目前碰到, 有4个原因:
1. SDKInitializer 方法执行的位置不对
2. so 文件 没有放到 jniLibs 下(并且 armeabi armeabi-v7a mips x86 都要放一份)
不过即使 都放了 一份也不能保证 模拟器是 没有问题, 真机 目前 测试没有发现问题。
3. 是一个最隐秘,也是比较恶心的问题:
相应功能的开发资源的时候,你可能选择
基础地图 or 基础地图 + 计算 工具 or 基础地图+ 定位功能 + 计算工具,
不同组合下载下来的,通常 都已 两个文件,分别是:
BaiduLBS_Android.jar
libBaiduMapSDK_v3_4_0_X.so (X 代表 0 1 2 .....)
不同组合 的这个两个文件 都不同( 看起来jar 是同名) ,
如果你把 基础地图 的 jar + (基础地图 + 计算 工具) 的 sdk . so ,组合编译,就会出现上述问题
4. 模拟器运行 (即使 armeabi armeabi-v7a mips x86 放一份) 也无法解决, @百度 这个你们得看看吧??
无奈只有:
if (!"generic".equalsIgnoreCase(Build.BRAND)) {
SDKInitializer.initialize(getApplicationContext());
}
在这里。如果使用androidStudio 最好将.so文件放在 src/main 下面自己创建的jniLibs文件夹下面。这种方式不必配置module的build.gradle文件。
如果所有.so文件放在libs文件夹下,AS不会主动加载libs下面so库,需要手动引导配置:
- android {
-
- sourceSets {
- main {
- manifest.srcFile 'AndroidManifest.xml'
- //添加下面一行就行了,其他的不用动
- jniLibs.srcDirs = ['libs']
- }
-
- }
(2) errorcode: 230 uid: -1 appid -1 msg: APP Scode码校验失败
首先,了解下什么是230错误:
为增强移动APP对百度开发SDK/API服务访问的控制,也避免恶意开发者对百度地图服务进行攻击,我们对Mobile类型(Android/IOS)的服务请求进行了安全码校验;所谓安全码即开发者在API控制台申请AK(AK和APP一一对应)时提供的APP签名的SHA1+”;”+包名
(具体可参考http://developer.baidu.com/map/index.php?title=androidsdk/guide/key)。
请求服务必须要携带该安全码作为参数,不携带或者携带不一致的安全码给服务端,均会返回230错误。
一般的解决方式:
查看一下APP当前签名的SHA1值(注意不是MD5)和包名,然后去API控制台把查看该AK对应配置的安全码是否和 APP实际的一致
如果检查后数字签名、包名、API_KEY没错的话,就是下面说的第二种问题了。
【1】AK错误 :那么就检查你的数字签名和包名有没有弄错
(我的检验后证明不是第一种错误)
【2】签名文件没有打包到程序
菜单栏选择 file -> project structure,选择应用的modules
安全码是sdk自动从APP配置中获取的,开发者无需自己填写。当出现230错误时,请开发者先查看一下APP当前签名的SHA1值(注意不是MD5)和包名,然后去API控制台把查看该AK对应配置的安全码是否和APP实际的一致,如果不一致请去API控制台手动修改一致即可~~
3. java.lang.UnsatisfiedLinkError: No implementation found for int com.baidu.platform.comjni.tools.JNITools.initClass
1.如果你是将jar包和so文件都放在app-libs文件夹下,就需要在build.grade文件中添加代码指定so文件路径,具体看截图
2.第二种配置方式是将jar包放在app-libs文件夹下,而将so文件放在src-main-jniLibs文件夹下,这个位置的so文件,工程会自动加载,不用做其他处理.
3.完成上面的步骤,并在清单文件中设置了百度API_KEY值,就可以愉快的试用了.
接下来,专门文章介绍AndroidStudio如何申请
百度地图新版Key中SHA1值:详情请转下一篇文章:http://blog.csdn.net/maiduoudo/article/details/78399790