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

如何通过编程实现Android屏幕/应用投屏至外部显示设备?

实现Android一键投屏的可行方案

针对你的需求(一键启动屏幕镜像到选定设备,无需进入系统设置),以下是几种直接可用的方案,覆盖Miracast和Chromecast两种主流投屏协议:

一、Miracast(无线显示):利用系统API直接控制

Android原生提供WifiDisplayManager与MediaProjection API的组合能力,可实现扫描、选定并一键连接Miracast设备的功能,无需跳转系统设置界面。

核心步骤:

  1. 申请屏幕捕获权限:屏幕镜像需要捕获设备屏幕内容,必须通过MediaProjectionManager动态申请权限:
val mediaProjectionManager = getSystemService(MEDIA_PROJECTION_SERVICE) as MediaProjectionManager
val captureIntent = mediaProjectionManager.createScreenCaptureIntent()
startActivityForResult(captureIntent, REQUEST_CODE_SCREEN_CAPTURE)

在onActivityResult回调中获取MediaProjection实例,后续投屏操作依赖该实例。

  1. 扫描并获取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)
  1. 一键连接选定设备:获取目标WifiDisplay实例后,直接发起连接:
val selectedDisplay = // 用户选定的WifiDisplay实例
wifiDisplayManager.connect(selectedDisplay, mediaProjection)

连接成功后,系统会自动推送屏幕内容到目标设备。

二、Chromecast屏幕镜像:利用Google Cast SDK的镜像功能

你之前对Cast SDK的理解有误——它不仅支持自定义HTML接收器,还原生支持Android设备的屏幕镜像,无需额外开发接收器。

核心步骤:

  1. 集成Cast SDK:在build.gradle中添加依赖:
implementation 'com.google.android.gms:play-services-cast-framework:21.3.0'
  1. 初始化Cast Context:在Application类中完成初始化:
class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        CastContext.getSharedInstance(this)
    }
}
  1. 发现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:00:15