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

Android Studio中区分视频与图片,避免对比窗口触发崩溃

解决方案

核心思路是在触发对比窗口前增加媒体类型判断,仅当上传/拍摄的是图片时才弹出对比窗口,视频则直接走上传流程不触发该窗口。

步骤1:获取媒体类型信息

你可以通过两种方式判断当前媒体是图片还是视频:

方式A:利用tmpMediaInfo内置字段(优先推荐)

如果tmpMediaInfo类中包含媒体类型属性(比如mediaType、isImage方法等),直接用该属性判断。假设tmpMediaInfo有isImage()方法:

var isImageMedia = false
val newUri = mediaLoadManager.handleLoadMediaResult(
    requestCode, resultCode, data,
    requireContext().applicationContext
) { tmpMediaInfo ->
    if (tmpMediaInfo.errorMsg != null) {
        processViewModel.updateMediaCount(null)
        processViewModel.updateMediaListInfoAfterEditError(tmpMediaInfo.errorMsg)
    } else {
        // 新增:标记当前媒体是否为图片
        isImageMedia = tmpMediaInfo.isImage() // 替换为实际的类型判断逻辑
        processViewModel.updateMediaListInfoAfterEdit(tmpMediaInfo)
        progressDialogMediaCompress?.show()
    }
}

方式B:通过Uri查询媒体类型

如果tmpMediaInfo没有类型信息,通过ContentResolver查询Uri对应的MIME类型:

// 新增工具方法:判断Uri是否为图片
private fun isImageUri(uri: Uri): Boolean {
    val mimeType = requireContext().contentResolver.getType(uri)
    return mimeType?.startsWith("image/") == true
}

步骤2:修改对比窗口弹出条件

在弹出COMPARE_MEDIA_DIALOG_FRAGMENT的判断逻辑中,新增媒体类型校验:

processViewModel.pictureDescriptionAndCompressionLiveData.observe(viewLifecycleOwner,
    EventObserver { pictureDescriptionAndCompression ->
        if (pictureDescriptionAndCompression != PICTURE_DESCRIPTION_NOT_AVAILABLE) {
            if (newUri != null && pictureDescriptionAndCompression == SiteSurveyTypeProgressViewModel.COMPRESSED) {
                progressDialogMediaCompress?.dismiss()
                processViewModel.updateMediaCount(newUri)
                // 新增:仅图片触发对比窗口,视频直接跳过
                if (isImageMedia) { // 如果用方式B,替换为isImageUri(newUri)
                    switchToUI(UiType.COMPARE_MEDIA_DIALOG_FRAGMENT, args = Bundle().apply {
                        putParcelable(KEY_MEDIA_URI, newUri)
                    }, parentFragmentManager)
                }
                // 视频无需对比,直接完成上传流程(如需额外处理可在此添加)
            } else if (pictureDescriptionAndCompression == SiteSurveyTypeProgressViewModel.NOT_COMPRESSED){
                progressDialogMediaCompress?.dismiss()
                showMediaSizeTooLargeAlert()
            }
        }
    })

可选优化:跳过视频压缩流程

如果视频不需要压缩,可在handleLoadMediaResult回调中提前判断,避免显示压缩弹窗:

val newUri = mediaLoadManager.handleLoadMediaResult(...) { tmpMediaInfo ->
    if (tmpMediaInfo.errorMsg != null) {
        // 原有错误处理逻辑
    } else {
        isImageMedia = tmpMediaInfo.isImage()
        processViewModel.updateMediaListInfoAfterEdit(tmpMediaInfo)
        // 仅图片显示压缩弹窗,视频直接跳过
        if (isImageMedia) {
            progressDialogMediaCompress?.show()
        }
    }
}

通过以上修改,就能确保只有图片会触发对比窗口,视频直接上传不触发,彻底避免因视频进入图片对比逻辑导致的崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:22:14