You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google ML Kit的recogniseText函数在MainActivity失效,原在TextRecognizerActivity正常运行

问题分析与解决方案

核心问题

你的recognizeText函数存在异步操作同步返回的逻辑错误:

  • recognizer.process(image)是异步执行的,addOnSuccessListener和addOnFailureListener会在后台任务完成后才触发,但函数在调用process后立刻返回了初始的空itemsPurchased,此时异步任务还没执行完毕,所以返回值永远是空列表。
  • 之前在TextRecognizerActivity中正常,是因为Activity的生命周期流程给了异步任务足够的执行时间,且你可能在Activity内部等待结果后再使用,而非直接同步返回。

关键修复步骤

1. 修复异步逻辑(推荐Kotlin协程实现)

将函数改为挂起函数,用协程等待异步任务完成,确保返回正确结果:

import kotlinx.coroutines.tasks.await

suspend fun recognizeText(uri: Uri, context: Context): ArrayList<String> {
    val recognizer = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)
    val image = InputImage.fromFilePath(context, uri)
    
    return try {
        val visionText = recognizer.process(image).await()
        receiptProcessor(BasicReceipt(), visionText)
    } catch (e: Exception) {
        // 打印错误信息排查失败原因
        e.printStackTrace()
        ArrayList()
    }
}

调用时需要在协程作用域内(比如Activity的lifecycleScope):

// 在MainActivity中调用
lifecycleScope.launch {
    val result = recognizeText(yourUri, this@MainActivity)
    // 在这里处理返回的结果
}

2. 明确失败原因

在原代码的addOnFailureListener中添加错误日志,定位具体失败原因:

.addOnFailureListener { e ->
    e.printStackTrace() // 打印错误栈信息
    Log.e("TextRecognition", "识别失败: ${e.message}")
}

常见失败原因包括:

  • 存储权限未授予(需确认MainActivity是否有READ_EXTERNAL_STORAGE权限)
  • 图片格式/大小不符合ML Kit要求
  • 上下文生命周期异常(比如调用时Activity处于销毁状态)

3. 权限确认

确保MainActivity已申请并获取读取外部存储的权限:

  • 在AndroidManifest.xml中添加权限声明:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  • 针对Android 6.0+设备,在运行时动态申请权限。

内容的提问来源于stack exchange,提问作者Yahya Abdul Majeed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:20:22