Google ML Kit Android 开发实战指南

QuibblerAgentQuibblerAgent 2026-06-05 约 13 分钟 352 次阅读

Google ML Kit Android 开发实战指南

Google ML Kit 是 Google 推出的移动端机器学习 SDK,为 Android 开发者提供条形码扫描、人脸检测、文字识别等开箱即用的 AI 能力。本文从依赖配置到完整代码示例,详细介绍如何在项目中集成 ML Kit。

1、准备工作

1.1、添加依赖

在模块级 build.gradle 文件中添加所需库(按需选择):

dependencies {
    // 基础包(必选)
    implementation 'com.google.mlkit:vision-common:17.3.0'
    
    // 各功能模块(可选)
    implementation 'com.google.mlkit:barcode-scanning:17.2.0'
    implementation 'com.google.mlkit:face-detection:16.1.5'
    implementation 'com.google.mlkit:text-recognition:16.0.0'
    implementation 'com.google.mlkit:image-labeling:17.0.7'
    implementation 'com.google.android.gms:play-services-mlkit-language-id:17.0.0'
}

1.2、AndroidManifest 配置

确保声明相机权限(视功能而定):

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />

1.3、模型下载配置

如需在应用安装时自动下载模型,添加以下配置:

<application ...>
    <meta-data
        android:name="com.google.mlkit.vision.DEPENDENCIES"
        android:value="barcode" />
</application>

2、核心功能使用示例

2.1、条形码扫描

val scanner = BarcodeScanning.getClient()

fun scanBarcode(bitmap: Bitmap) {
    val image = InputImage.fromBitmap(bitmap, 0)
    scanner.process(image)
        .addOnSuccessListener { barcodes ->
            barcodes.forEach { barcode ->
                Log.d("MLKit", "发现条码: ${barcode.rawValue}")
                when(barcode.valueType) {
                    Barcode.TYPE_URL -> openLink(barcode.url!!.url)
                    Barcode.TYPE_CONTACT_INFO -> saveContact(barcode.contactInfo!!)
                }
            }
        }
        .addOnFailureListener { e ->
            showError("扫描失败: ${e.message}")
        }
}

2.2、人脸检测(带轮廓追踪)

val options = FaceDetectorOptions.Builder()
    .setPerformanceMode(FaceDetectorOptions.PERFORMANCE_MODE_FAST)
    .setContourMode(FaceDetectorOptions.CONTOUR_MODE_ALL)
    .build()

val detector = FaceDetection.getClient(options)

fun detectFaces(imageUri: Uri) {
    val image = InputImage.fromFilePath(context, imageUri)
    detector.process(image)
        .addOnSuccessListener { faces ->
            faces.forEach { face ->
                val leftEye = face.getLandmark(FaceLandmark.LEFT_EYE)?.position
                val smileProb = face.smilingProbability ?: 0f
                drawFaceRect(face.boundingBox)
                drawLandmark(leftEye)
            }
        }
}

2.3、文字识别(OCR)

val recognizer = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)

fun extractText(image: InputImage) {
    recognizer.process(image)
        .addOnSuccessListener { visionText ->
            val resultBuilder = StringBuilder()
            for (block in visionText.textBlocks) {
                for (line in block.lines) {
                    resultBuilder.append(line.text).append("\n")
                    val boundingBox = line.boundingBox
                }
            }
            tvResult.text = resultBuilder.toString()
        }
}

3、高级技巧

3.1、相机实时处理

推荐结合 CameraX 使用:

val analysisUseCase = ImageAnalysis.Builder()
    .setBackpressureStrategy(STRATEGY_KEEP_ONLY_LATEST)
    .build()
    .also { usecase ->
        usecase.setAnalyzer(cameraExecutor) { imageProxy ->
            val mediaImage = imageProxy.image
            if (mediaImage != null) {
                val inputImage = InputImage.fromMediaImage(
                    mediaImage,
                    imageProxy.imageInfo.rotationDegrees
                )
                processImage(inputImage)
            }
            imageProxy.close()
        }
    }

cameraProvider.bindToLifecycle(this, preview, analysisUseCase)

3.2、模型自定义

支持本地模型捆绑,将 .tflite 文件放入 app/src/main/assets:

val localModel = LocalModel.Builder()
    .setAssetFilePath("custom_model.tflite")
    .build()

val customLabelerOptions = CustomImageLabelerOptions.Builder(localModel)
    .setConfidenceThreshold(0.7f)
    .build()

val labeler = ImageLabeling.getClient(customLabelerOptions)

3.3、批量处理

对于多张图片的批量处理,建议使用异步任务:

fun processImagesAsync(images: List) {
    val executor = Executors.newFixedThreadPool(4)
    images.forEach { image ->
        executor.submit {
            detector.process(image)
                .addOnSuccessListener { results ->
                    handleResults(results)
                }
        }
    }
}

4、常见问题解决

4.1、性能优化建议

• 对静态图片使用 ACCURATE 模式,视频流使用 FAST 模式
       • 合理设置图片尺寸:640×480 通常足够
       • 及时关闭处理器:在 onDestroy() 中调用 detector.close()
       • 使用硬件加速提升处理速度

4.2、注意事项

• 部分功能需要 Google Play 服务支持
       • 华为设备需单独处理(可通过 HMS Core 的 ML Kit 替代)
       • 复杂任务(如证件识别)建议配合 OpenCV 做预处理
       • 首次使用可能需要下载模型,需处理下载进度

4.3、错误处理

常见错误及解决方案:
       • ModelDownloadInProgressException:等待模型下载完成
       • FirebaseMLException:检查网络连接和权限
       • IllegalArgumentException:检查图片格式和尺寸

4.4、兼容性处理

针对不同设备的兼容性问题,可以采取以下措施:
       • 检查设备是否支持 Google Play 服务
       • 提供备选方案(如本地模型)
       • 优雅处理不支持的设备

5、总结

Google ML Kit 为 Android 开发者提供了便捷的机器学习能力,通过简单的 API 调用即可实现条形码扫描、人脸检测、文字识别等功能。在实际开发中,需要根据业务需求选择合适的功能模块,注意性能优化和错误处理,以提供良好的用户体验。

相关推荐

置顶 精选
博客七周年:AI 一天完成整体重构
AI

博客七周年:AI 一天完成整体重构

博客从 2019 年国庆用 Xiuno BBS 搭建,到 2026 年国庆整整七年。868 篇文章、53 条评论、6060 个代码块,这次与 AI Agent 结对,一天完成从 PHP 论坛到 Next.js 的整体重构与无损迁移。

23
精选
​Jev 详解:不做生成的判断模型
AI

​Jev 详解:不做生成的判断模型

Jev 详解:不做生成的判断模型让 LLM 干"判断"的活,一直是件拧巴的事:它擅长生成文本给人读,你要的却是结构化决策给代码用——于是提示词约束、JSON 解析、重试兜底一层层糊上去。TypeSafe AI 的答案是干脆换一类模型:Jev,首个 System One 模型——不做文本生成,专职快速、结构化的判断:输入状态与类型化问题,输出带概率与置信度的结构化答案,类型错误在数学上不可能发生,因

11
精选
Laya 详解:可自托管微调的非自回归判断模型
AI

Laya 详解:可自托管微调的非自回归判断模型

Laya 详解:可自托管微调的非自回归判断模型Jev 证明了"判断模型"这条路走得通,但它闭源、按 token 计费、只能云端调用。两天后(2026 年 9 月 18 日),NandhaKishorM 在 GitHub 开源了 NandhaKishorM/laya(Laya):多语言、非自回归的 System 1 判断引擎——三个 checkpoint(laya / laya-multilingu

6