本文采用的环境是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_KEY、INVALID_USER_SCODE(新版本显示)或SERVICE_NOT_EXIST(老版本显示)。
注:虽然Android有SERVICE_NOT_EXIST提示但是在高德的错误码中其已经被弃用。
可按照如下操作解决问题:
第一部分:对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设置部分
第三步:确保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。
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的值。
获取到Debug的SHA1值后返回高德开放平台中key的位置,将调试版安全码SHA1进行补充填充。
提交之后,会自动更新一下原key,但key值不变,即可解决鉴权错误问题。
存在错误欢迎指正,欢迎大家在评论区进行讨论。