You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用华为移动服务(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

火山引擎 最新活动