fragment中使用aMap高德地图的一个小坑

最近项目需求在fragment中的scrollview中加载高德地图控件和定位。,中间遇到一点坑,把过程记录下来。

按照开发文档,导入依赖、添加权限、应用key、AppService。

第一个坑点

导入依赖,我是直接把官方的依赖导入工程:


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'

然后build时就出错了,这个问题把exception信息搜索一下就可以知道是重复依赖的问题, 原来,是3D地图和导航重复了。导航兼容了3D地图的包。根据需求去掉一个就行了。

第二个坑点

appKey这里,按照官方文档的方法,jdk的工具keytool读取SH1码,生成的key,运行后,出现error 7

定位失败,7: KEY错误 请到http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/ 查看错误码说明
按照提示,找到官方的错误码对照表,这个错误是典型的鉴权失败。可是我的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 , 应用未重启就可以定位了。

你可能感兴趣的:(fragment中使用aMap高德地图的一个小坑)