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
相关产品推荐
相关产品推荐

