最近项目需求在fragment中的scrollview中加载高德地图控件和定位。,中间遇到一点坑,把过程记录下来。
按照开发文档,导入依赖、添加权限、应用key、AppService。
第一个坑点
导入依赖,我是直接把官方的依赖导入工程:
<code>
3D地图
compile 'com.amap.api:3dmap:latest.integration'
2D地图
compile 'com.amap.api:map2d:latest.integration'
导航
compile 'com.amap.api:navi-3dmap:latest.integration'
搜索
compile 'com.amap.api:search:latest.integration'
定位
compile 'com.amap.api:location:latest.integration'</code>
然后build时就出错了,这个问题把exception信息搜索一下就可以知道是重复依赖的问题, 原来,是3D地图和导航重复了。导航兼容了3D地图的包。根据需求去掉一个就行了。
第二个坑点
appKey这里,按照官方文档的方法,jdk的工具keytool读取SH1码,生成的key,运行后,出现error 7
<code>定位失败,7: KEY错误 请到http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/ 查看错误码说明</code>
按照提示,找到官方的错误码对照表,这个错误是典型的鉴权失败。可是我的sh1码没问题的呀,问题在哪呢?
点进高频问题看看
可以看到,官方给了两个解决方案。
方案一是我们已经用过的套路,再检查一遍,没有问题。
方案二,它提供了一个方法,将这个方法导入代码中,获取app的SH1码。
publicstatic String sHA1(Context context) {
try {
PackageInfo info = context.getPackageManager().getPackageInfo(
context.getPackageName(), PackageManager.GET_SIGNATURES);
byte[] cert = info.signatures[0].toByteArray();
MessageDigest md = MessageDigest.getInstance("SHA1");
byte[] publicKey = md.digest(cert);
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < publicKey.length; i++) {
String appendString = Integer.toHexString(0xFF & publicKey[i])
.toUpperCase(Locale.US);
if (appendString.length() == 1)
hexString.append("0");
hexString.append(appendString);
hexString.append(":");
}
String result = hexString.toString();
return result.substring(0, result.length()-1);
} catch (NameNotFoundException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
果然有猫腻,代码输出的SH1码和keytool读取的jks文件里的SH1码完全不一样!
最后,更新一下高德的key , 应用未重启就可以定位了。