You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动