gpt4 book ai didi

android - 在 Android 中检测当前音频路由的有效方法?

转载 作者:太空宇宙 更新时间:2023-11-03 10:23:54 25 4
gpt4 key购买 nike

我的应用程序需要能够了解用户选择的基本音频路径。在 iOS 上,这是微不足道的,因为您只需注册一个回调,就可以确切地知道音频的去向。

在 Android 上,我很高兴看到 MediaRouter 类,但令我沮丧的是,事实证明没有可预测的方法来确定路由类型。例如,当切换到蓝牙 A2DP 设备时,唯一的标识项是 RouteInfo.getName() 方法,但这会返回 A2DP 设备的友好名称,因此无法进行比较。

我也尝试过使用以下广播:

AudioManager.ACTION_AUDIO_BECOMING_NOISY
Intent.ACTION_HEADSET_PLUG
BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED
BluetoothA2dp.ACTION_PLAYING_STATE_CHANGED
BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED

但是这种方法很容易出错。例如,如果你连接到蓝牙 A2DP,然后你插入耳机,很容易看出路由是“耳机”,但是当拔下耳机时你必须猜测哪个路由仍然有效,通过记录来自所有蓝牙事件的连接状态。

当您的应用程序启动时,也很难确定初始音频路由。 HEADSET_PLUG 是粘性的,所以这很好,但没有别的......

关于如何解决这个问题并准确检测这个问题有什么建议吗?为什么这在 Android 中是一项如此困难的任务?

最佳答案

这是一种非常hackish的轮询当前路由的方式,它也支持A2DP的检测。使用风险自负,因为这些类的内部结构将来可能会发生很大变化。不过,它应该适用于 Jellybean 和 Jellybean MR1。

String ouputDeviceName;
try {
MediaRouter mr = (MediaRouter)getSystemService(Context.MEDIA_ROUTER_SERVICE);
Class mediaRouterClass = Class.forName("android.media.MediaRouter");
Method getSystemAudioRouteMethod = mediaRouterClass.getMethod("getSystemAudioRoute");
RouteInfo ri = (RouteInfo)getSystemAudioRouteMethod.invoke(mr);

Class mediaRouterStaticClass = Class.forName("android.media.MediaRouter$Static");
Field staticField = mediaRouterClass.getDeclaredField("sStatic");
Field a2dpField = mediaRouterStaticClass.getDeclaredField("mBluetoothA2dpRoute");
AccessibleObject.setAccessible(new AccessibleObject[]{staticField}, true);
AccessibleObject.setAccessible(new AccessibleObject[]{a2dpField}, true);
Object a2dpRoute = a2dpField.get(staticField.get(null));
if (a2dpRoute != mr.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_AUDIO)) {
// Phone, Headphone, HDMI, etc..
ouputDeviceName = "name: " + ri.getName().toString();
} else {
// Audio is routed to A2DP
ouputDeviceName = "name: A2DP";
}
} catch (Exception e) {
e.printStackTrace();
}

关于android - 在 Android 中检测当前音频路由的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15285856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com