使用华为移动服务(HMS)ML Kit云端实时翻译时遭遇Token无效或过期异常的技术咨询
解决HMS ML Kit云端翻译"Token is invalid or expired"异常问题
我来帮你拆解这个问题,结合HMS ML Kit的运行机制和你的代码来看:
一、异常的核心成因
你遇到的Token is invalid or expired异常,最直接的原因是API Key的编码处理错误。你的代码里对从AGC获取的API Key做了URLEncoder.encode编码,但HMS SDK要求直接使用原始未编码的API Key——编码后的字符串会被服务端判定为无效凭证,导致无法生成合法的访问Token,最终触发这个异常。
除此之外,也可以排查这些次要可能性:
- API Key本身复制错误(比如多了空格、少了字符,或者来自AGC中错误的项目/应用)
- 应用包名与AGC注册的包名不匹配(包名不一致会直接导致API Key验证失败)
- 设备网络异常,无法正常连接华为云端服务获取Token
二、此处的Token是什么?
这里的Token是华为云端服务颁发的临时访问令牌。当你配置好API Key后,HMS SDK会自动向华为服务器发起请求,用API Key换取这个Token;后续调用云端翻译、语言列表查询等接口时,SDK会携带这个Token来证明请求的合法性。Token有有效期,SDK会自动刷新,但如果API Key本身无效,就根本无法获取到可用的Token,自然会抛出这个异常。
三、修复方案
1. 修正API Key配置代码
首先去掉不必要的URLEncoder编码,直接返回原始API Key:
MLApplication.getInstance().apiKey = Utils.apiKey object Utils { private const val TAG = "Utils" @JvmStatic val apiKey: String? get() { // 直接返回从AGC复制的原始API Key,无需编码 return "myApiKey" // 替换为你从AGC获取的真实API Key } }
2. 额外检查项
- 确认API Key是从AppGallery Connect对应项目的「项目设置」→「常规」→「API Key」复制的,确保字符完全一致
- 核对应用包名与AGC中注册的包名完全匹配,大小写、特殊字符都不能错
- 测试设备网络正常,能正常访问华为云端服务(避免代理、防火墙拦截)
- 可以在初始化后打印
MLApplication.getInstance().apiKey,确认配置的是正确的原始值
3. 推荐改用异步调用(优化体验)
同步调用容易阻塞主线程,建议换成异步方法:
// 异步获取云端支持的语言列表 MLTranslateLanguage.getCloudAllLanguages(object : MLResultListener<Set<String>> { override fun onSuccess(result: Set<String>?) { // 处理成功返回的语言集合 } override fun onFailure(error: MLException?) { error?.let { Log.e("ML exception", it.message.toString()) } } }) // 异步执行翻译 mlRemoteTranslator.asyncTranslate("SOURCE", object : MLResultListener<String> { override fun onSuccess(result: String?) { val output = result ?: "" // 处理翻译结果 } override fun onFailure(error: MLException?) { error?.let { Log.e("ML exception", it.message.toString()) } } })
内容的提问来源于stack exchange,提问作者Botond Sulyok




