Android平台下如何获取当前选中的媒体音频输出设备名称?
获取Android当前选中媒体音频输出设备名称的正确方法
我之前也折腾过这个问题,确实刚开始用AudioManager和MediaRouter的时候容易找错方向,其实核心是用好MediaRouter的路由信息,再结合版本适配来处理不同场景:
1. 优先使用MediaRouter API(API 21+)
MediaRouter是专门用来管理媒体路由的,它的selectedRoute直接对应当前正在使用的媒体输出设备,获取名称非常直接:
Kotlin 示例代码
// 获取MediaRouter实例 val mediaRouter = getSystemService(Context.MEDIA_ROUTER_SERVICE) as MediaRouter // 获取当前选中的路由 val currentRoute = mediaRouter.selectedRoute // 提取设备名称 val deviceName = currentRoute.name
Java 示例代码
MediaRouter mediaRouter = (MediaRouter) getSystemService(Context.MEDIA_ROUTER_SERVICE); MediaRouter.RouteInfo currentRoute = mediaRouter.getSelectedRoute(); String deviceName = currentRoute.getName();
如果需要实时监听设备切换(比如用户插上耳机、切换蓝牙音箱),可以注册MediaRouter.Callback来接收路由变化通知:
val routerCallback = object : MediaRouter.Callback() { override fun onRouteSelected(router: MediaRouter, type: Int, route: MediaRouter.RouteInfo) { super.onRouteSelected(router, type, route) // 设备切换时更新名称 val newDeviceName = route.name // 这里可以更新UI或者保存状态 } } // 注册回调,监听音频路由变化 mediaRouter.addCallback( MediaRouter.ROUTE_TYPE_LIVE_AUDIO, routerCallback, MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY ) // 记得在合适的时机(比如Activity销毁)移除回调 mediaRouter.removeCallback(routerCallback)
2. 兼容旧版本的AudioManager方案(API 23+)
如果需要兼容API 23到20的版本,可以用AudioManager.getDevices()来获取输出设备,不过需要自己筛选当前活跃的设备:
val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager // 获取所有音频输出设备 val outputDevices = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS) for (device in outputDevices) { // 判断是否是当前活跃的输出设备(比如蓝牙A2DP、有线耳机、扬声器) if (device.isSink) { // 获取设备名称,注意蓝牙设备可能需要BLUETOOTH_CONNECT权限(Android 12+) val deviceName = device.productName?.toString() ?: "未知设备" // 这里可以结合播放状态进一步确认是否是当前使用的设备 } }
注意事项
- 权限问题:如果要获取蓝牙设备的名称,Android 12及以上需要申请
BLUETOOTH_CONNECT权限;Android 11及以下需要BLUETOOTH权限。 - 版本适配:MediaRouter从API 21开始提供,AudioDeviceInfo(
getDevices()返回的类型)从API 23开始可用。 - 特殊设备处理:有些设备的名称可能需要本地化处理,
RouteInfo.getName()会自动返回系统本地化后的名称,比直接用AudioDeviceInfo的名称更友好。
Spotify这类应用就是基于MediaRouter的路由监听来实时更新当前输出设备名称的,这个方案是最可靠的。
内容的提问来源于stack exchange,提问作者ascu




