Android Kotlin中如何创建仅显示支持视频通话应用的选择器?
解决Android Kotlin中仅显示支持视频通话应用的选择器问题
原代码的问题
你当前使用Intent.ACTION_SEND + video/*的方式,本质是唤起视频文件分享的应用选择器,而非视频通话应用。这就导致:
- 会混入支持视频分享但不支持视频通话的应用(比如图库、视频编辑工具)
- 真正的视频通话应用(如Skype、WhatsApp)不会响应这个动作,所以无法被唤起
正确实现方案
方案一:利用系统视频通话Intent(推荐)
使用系统标准的视频通话Intent,让系统自动筛选支持该功能的应用:
val videoCallIntent = Intent(Intent.ACTION_VIEW).apply { // 可指定具体号码,例如 tel:+8613800138000,不指定则显示通用选择器 data = Uri.parse("tel:") // 标记启动视频通话 putExtra(Intent.EXTRA_START_CALL_WITH_VIDEO, true) } val chooser = Intent.createChooser(videoCallIntent, "选择视频通话应用") try { context.startActivity(chooser) } catch (e: ActivityNotFoundException) { // 处理无支持应用的场景,例如提示用户安装相关应用 }
方案二:手动精准筛选应用
如果系统筛选不够精准,可通过包名手动指定需要显示的视频通话应用,避免无关应用混入:
val baseIntent = Intent(Intent.ACTION_VIEW).apply { data = Uri.parse("tel:") putExtra(Intent.EXTRA_START_CALL_WITH_VIDEO, true) } val packageManager = context.packageManager // 查询所有支持该Intent的应用 val resolveInfos = packageManager.queryIntentActivities(baseIntent, 0) // 过滤出指定的视频通话应用(包名可根据需求调整) val targetPackages = listOf( "com.skype.raider", // Skype "com.whatsapp", // WhatsApp "com.google.android.apps.meetings", // Google Meet "com.google.android.apps.tachyon", // Google Duo "us.zoom.videomeetings" // Zoom ) val filteredIntents = resolveInfos .filter { targetPackages.contains(it.activityInfo.packageName) } .map { Intent(baseIntent).apply { setPackage(it.activityInfo.packageName) } }.toTypedArray() if (filteredIntents.isNotEmpty()) { val chooser = Intent.createChooser(filteredIntents[0], "选择视频通话应用").apply { putExtra(Intent.EXTRA_INITIAL_INTENTS, filteredIntents.drop(1).toTypedArray()) } context.startActivity(chooser) } else { // 无支持应用时的处理逻辑 }
补充说明
- 如果需要发起指定联系人的视频通话,将
Uri.parse("tel:")替换为具体号码(如tel:+8613800138000),部分应用会直接跳转到该联系人的视频通话界面。 - 方案二中的应用包名需注意版本更新,部分应用可能会变更包名,需及时调整。
内容的提问来源于stack exchange,提问作者Jai Hinsu
相关产品推荐
相关产品推荐

