解决使用Android SDK 调用高德业务返回 INVALID_USER_KEY(SCODE) 、SERVICE_NOT_EXIST的问题(高德key中sha1值与android中sha1值不匹配)

本文采用的环境是Android Studio Electric Eel | 2022.1.1 Canary 10 2022.12.21版本(不建议采用最新版本,建议使用老版本)           JDK 版本为 JAVA 11

版本下载地址:https://developer.android.google.cn/studio/archive?hl=zh-cn

当返回 错误码 7 时,或者INVALID_USER_KEYINVALID_USER_SCODE(新版本显示)或SERVICE_NOT_EXIST(老版本显示)。

注:虽然Android有SERVICE_NOT_EXIST提示但是在高德的错误码中其已经被弃用。

da8a62568ac049acbb93bce94803f0de.jpeg

f521ec322e38495498cb2c94eea3de92.png

可按照如下操作解决问题:

第一部分:对key的设置进行检查

检查SHA1值

第一步:获取APK当前签名文件的SHA1

1、请参考Android Studio获取开发版SHA1和发布版SHA1[通俗易懂]-腾讯云开发者社区-腾讯云进入目录C:\Users\ad\.android下,执行:keytool -list -v -keystore debug.keystore,输入口令:android(默认密码)https://cloud.tencent.com/developer/article/2117395一文,提供的SHA1值获取方式取得AAB或APK当前使用的SHA1值。

第二步:修改高德的key设置部分

15312cf4aaac41c08ab7b2487dabfc5c.png

第三步:确保SHA1值一致,如不一致请调整一致。

检查包名

1、Key注册时填写的包名应该与AndroidManifest.xml配置文件的package属性内容相一致,如不一致请调整。

2、Android Studio开发者请注意调整build.gradle文件的applicationid与package一致,如不一致将会导致鉴权失败。

3、请注意检查包名的大小写是否统一。

检测Key值填写位置:

1、通过AndroidManifest.xml配置Key。

meta-data标签位置需要在application标签内部。

<meta-data android:name="com.amap.api.v2.apikey" android:value="您的Key"> </meta-data>

2.检测key是否填写正确。       key为高德开放平台-控制台-我的应用-对应的key。

21247ac5899146f3af0e8dc5420f3aef.png

3、检查调用方法。

第二部分:获取测试key的SHA1值

以上均没有问题后,在调用api的java文件的onCreate中添加以下代码。

// 从Manifest中读取API Key
String apiKey = getMetaData("com.amap.api.v2.apikey");
if (apiKey != null) {
    Log.d("API Key", "成功获取API Key: " + apiKey);
} else {
    Log.e("API Key", "API Key 获取失败");
}

// 获取应用的 SHA1
String sha1 = getSHA1(this);  // 通过类名调用 getSHA1 方法
Log.d("SHA1", "应用的 SHA1: " + sha1);

在onCreate之外添加以下代码的方法。

     // 计算 SHA1
    public static String getSHA1(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);
            StringBuilder hexString = new StringBuilder();
            for (byte b : publicKey) {
                String appendString = Integer.toHexString(0xFF & b).toUpperCase(Locale.US);
                if (appendString.length() == 1) {
                    hexString.append("0");
                }
                hexString.append(appendString).append(":");
            }
            String result = hexString.toString();
            return result.substring(0, result.length() - 1);
        } catch (PackageManager.NameNotFoundException | NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }


    // 辅助方法:获取Meta-Data中的值
    private String getMetaData(String key) {
        try {
            ApplicationInfo appInfo = getPackageManager()
                    .getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
            return appInfo.metaData.getString(key);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            return null;
        }
    }

通过以上代码使用Debug或Logcat获取SHA1值。

这里采用在     Log.d("SHA1", "应用的 SHA1: " + sha1);       处打断点,通过Debug获取SHA1的值。

128c30bbc456448d82973447e2eb4c53.png

获取到Debug的SHA1值后返回高德开放平台中key的位置,将调试版安全码SHA1进行补充填充。

1f61d4a037b146249fe9d5056b9595b5.png

提交之后,会自动更新一下原key,但key值不变,即可解决鉴权错误问题。

存在错误欢迎指正,欢迎大家在评论区进行讨论。