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

