如何通过编程实现Android屏幕/应用投屏至外部显示设备?
实现Android一键投屏的可行方案
针对你的需求(一键启动屏幕镜像到选定设备,无需进入系统设置),以下是几种直接可用的方案,覆盖Miracast和Chromecast两种主流投屏协议:
一、Miracast(无线显示):利用系统API直接控制
Android原生提供WifiDisplayManager与MediaProjection API的组合能力,可实现扫描、选定并一键连接Miracast设备的功能,无需跳转系统设置界面。
核心步骤:
- 申请屏幕捕获权限:屏幕镜像需要捕获设备屏幕内容,必须通过
MediaProjectionManager动态申请权限:
val mediaProjectionManager = getSystemService(MEDIA_PROJECTION_SERVICE) as MediaProjectionManager val captureIntent = mediaProjectionManager.createScreenCaptureIntent() startActivityForResult(captureIntent, REQUEST_CODE_SCREEN_CAPTURE)
在onActivityResult回调中获取MediaProjection实例,后续投屏操作依赖该实例。
- 扫描并获取Miracast设备列表:通过
WifiDisplayManager扫描可用的无线显示设备:
val wifiDisplayManager = getSystemService(WIFI_DISPLAY_SERVICE) as WifiDisplayManager val scanCallback = object : WifiDisplayManager.ScanCallback() { override fun onScanResultsAvailable(results: List<WifiDisplay>?) { // 处理扫描到的设备列表,例如展示给用户选择 results?.forEach { display -> Log.d("Miracast", "设备名称:${display.name},地址:${display.deviceAddress}") } } } wifiDisplayManager.startScan(scanCallback)
- 一键连接选定设备:获取目标
WifiDisplay实例后,直接发起连接:
val selectedDisplay = // 用户选定的WifiDisplay实例 wifiDisplayManager.connect(selectedDisplay, mediaProjection)
连接成功后,系统会自动推送屏幕内容到目标设备。
二、Chromecast屏幕镜像:利用Google Cast SDK的镜像功能
你之前对Cast SDK的理解有误——它不仅支持自定义HTML接收器,还原生支持Android设备的屏幕镜像,无需额外开发接收器。
核心步骤:
- 集成Cast SDK:在
build.gradle中添加依赖:
implementation 'com.google.android.gms:play-services-cast-framework:21.3.0'
- 初始化Cast Context:在Application类中完成初始化:
class MyApp : Application() { override fun onCreate() { super.onCreate() CastContext.getSharedInstance(this) } }
- 发现Chromecast设备并启动镜像:使用
MediaRouter发现设备,选定后启动屏幕镜像会话:
val mediaRouter = MediaRouter.getInstance(this) val routeSelector = CastMediaRouteSelector.Builder() .setCastDeviceCategory(CastMediaRouteSelector.CATEGORY_CAST) .build() // 弹出设备选择对话框,用户选定后自动启动镜像 val routeDialog = MediaRouter.RouteDialogFactory.getDefault().createRouteDialog(mediaRouter, routeSelector) routeDialog.show(supportFragmentManager, "cast_dialog") // 或手动选定设备后启动镜像 val selectedRoute = // 用户选定的MediaRouter.RouteInfo val castSession = CastContext.getSharedInstance(this).sessionManager.currentCastSession castSession?.startMirroring(this)
三、简化方案:唤起系统投屏选择弹窗
如果不想深入API开发,可通过隐式Intent直接唤起系统的投屏设备选择弹窗(比进入设置界面更便捷):
val intent = Intent("android.intent.action.MEDIA_ROUTER_PICKER") intent.putExtra("android.intent.extra.MEDIA_ROUTER_TYPE", "cast") startActivity(intent)
这个Intent会直接弹出设备选择对话框,用户选定后系统自动完成投屏连接。
注意事项:
- 所有方案都要求设备支持对应投屏协议(Miracast或Chromecast),且手机与目标设备处于同一局域网。
MediaProjection权限在Android 10+有后台捕获限制,建议在前台发起投屏操作。- Chromecast方案需要设备安装Google Play服务,国内部分机型可能需要适配。
内容的提问来源于stack exchange,提问作者David Carvalho
相关产品推荐
相关产品推荐

