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

如何为ML Kit下载的Digital Ink识别模型显示下载进度?

实现Google Digital Ink模型下载的进度条展示

当然可以实现下载进度的可视化啦!Google ML Kit的RemoteModelManager提供了监听下载进度的接口,咱们只需要添加一个ModelDownloadListener就能实时获取下载的字节数变化,进而更新进度条。

修改后的完整代码

fun download(context: Context, progressBar: ProgressBar) {
    var modelIdentifier: DigitalInkRecognitionModelIdentifier? = null
    try {
        modelIdentifier = DigitalInkRecognitionModelIdentifier.fromLanguageTag(lang)
    } catch (e: MlKitException) {
        // 处理语言标签解析失败的情况
        Log.e("StrokeManager", "Failed to parse language tag: $e")
        Toast.makeText(context, "Invalid language tag", Toast.LENGTH_SHORT).show()
        return
    }

    model = DigitalInkRecognitionModel.builder(modelIdentifier!!).build()
    val remoteModelManager = RemoteModelManager.getInstance()
    val downloadConditions = DownloadConditions.Builder().build()

    // 创建下载进度监听器
    val downloadListener = object : ModelDownloadListener {
        override fun onDownloadCompleted(model: RemoteModel) {
            // 下载完成后移除监听器,避免内存泄漏
            remoteModelManager.removeModelDownloadListener(this)
            Log.i("StrokeManager", "Model downloaded")
            Toast.makeText(context, "Model Downloaded", Toast.LENGTH_SHORT).show()
            progressBar.visibility = View.GONE
        }

        override fun onDownloadFailed(model: RemoteModel, error: Exception) {
            remoteModelManager.removeModelDownloadListener(this)
            Log.e("StrokeManager", "Error while downloading a model: $error")
            Toast.makeText(context, "Model Download Failed", Toast.LENGTH_SHORT).show()
            progressBar.visibility = View.GONE
        }

        override fun onDownloadProgress(model: RemoteModel, bytesDownloaded: Long, totalBytesToDownload: Long) {
            // 计算进度百分比并更新进度条
            val progressPercent = (bytesDownloaded * 100 / totalBytesToDownload).toInt()
            progressBar.progress = progressPercent
            // 可选:添加进度文本提示
            // (context as? Activity)?.findViewById<TextView>(R.id.tv_progress)?.text = "已下载${progressPercent}%"
        }
    }

    // 注册监听器并启动下载
    remoteModelManager.addModelDownloadListener(downloadListener)
    remoteModelManager.download(model, downloadConditions)
}

关键说明

  • 进度条配置:确保你的布局中的ProgressBar的android:max属性设置为100(默认值就是100,无需额外修改),这样进度百分比可以直接映射到进度条的进度值。
  • 内存泄漏防范:在下载完成或失败后,一定要调用removeModelDownloadListener移除监听器,避免因监听器持有Context引用导致的内存泄漏。
  • UI更新安全:ML Kit的监听器回调是在主线程执行的,所以可以直接在onDownloadProgress中更新进度条和文本,不需要额外切换线程。
  • 调用方式:在Activity或Fragment中调用这个方法时,传入布局中的ProgressBar实例即可,比如:
    download(this, findViewById(R.id.progress_bar))
    

内容的提问来源于stack exchange,提问作者kuro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:02:34