当前位置: 首页 > 知识库问答 >
问题:

Android中检测当前音频路径的有效方法?

方鸿羲
2023-03-14

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

在Android上,我很高兴看到< code>MediaRouter类,然而令我沮丧的是,没有可预测的方法来确定html" target="_blank">路由类型。例如,当切换到蓝牙A2DP设备时,唯一的标识项是< code>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中这是一个如此困难的任务?

共有1个答案

扈德容
2023-03-14

这是一种非常粗略的对当前路由的轮询方式,它也支持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();
}
 类似资料:
  • 我正在使用react路由器。我想检测我来自哪里的上一页(在同一应用程序中)。我的上下文中有路由器。但是,我在路由器对象上没有看到任何属性,如“先前路径”或历史记录。我该怎么做?

  • 问题内容: 我正在使用React Router。我想检测我来自何处的上一页(在同一应用程序内)。我在上下文中拥有路由器。但是,我在路由器对象上看不到“上一条路径”或历史记录之类的任何属性。我该怎么做? 问题答案: 您可以在生命周期方法中保存先前的路径。该逻辑非常接近文档的疑难解答部分中提供的示例。 最近,可以从州访问它。

  • 刚刚开始开发iOS 7,发现与AudioSession相关的函数和PropertyListeners在iOS 7中已被弃用。 在我使用以下方法检测耳机是否已插入设备或从设备中拔出之前: 然后实现侦听器回调,对内部算法做不同的事情。现在iOS7弃用了它,也没有任何替代方案的文档。这里有专家的解决方案吗?谢谢!

  • 原文链接 : Android’s 10 Millisecond Problem: The Android Audio Path Latency Explainer 作者 : Gabor (@szantog) and Patrick (@Pv), founders of Superpowered 译者 : objectlife 校对者: 状态 : 许多手机应用都是非常依赖低音频功能的,比如游戏类,合

  • 本文向大家介绍nodejs取得当前执行路径的方法,包括了nodejs取得当前执行路径的方法的使用技巧和注意事项,需要的朋友参考一下 process.cwd() 当前执行程序的路径(执行命令行时候的路径,不是代码路径 例如 在根目录下执行 node ./xxx/xxx/a.js 则 cwd 返回的是 根目录地址 ) __dirname: 代码存放的位置 process.execPath: 当前执行的

  • 问题内容: 尽管我在此站点上有许多有关音高检测概念的问题……他们都处理了我不熟悉的神奇 FFT 。我正在尝试构建需要实现音高检测的Android应用程序。我绝对不了解用于执行此操作的算法。 它不能 是 硬可以吗?毕竟,Android市场上大约有80亿个吉他调音器应用程序。 有人可以帮忙吗? 问题答案: 快速傅立叶变换将功能从时域更改为频域。因此,而不是在那里是信号,你是从麦克风获取和是信号的时间指