【问题标题】:How to detect if a headphones / a headset is connected to an Android device in React Native如何在 React Native 中检测耳机/耳机是否连接到 Android 设备
【发布时间】:2020-08-17 21:24:43
【问题描述】:

我正在制作一个通话应用程序,用户可能会或可能不会使用耳机/耳机。在来电视频通话中,我使用react-native-incall-manager 打开扬声器/允许扬声器电话。基本的InCallManager.start({ media: 'video' }); 方法有效,并允许检测插入的新音频设备(例如耳机),如果发生这种情况,插入的耳机和麦克风会按预期工作。

问题出现在通话开始前耳机已经插入设备的情况下,因为此时调用了InCallManager.setSpeakerphoneOn(true);方法。 InCallManager.start({ media: 'video' }); 不考虑已经连接的设备并且耳机不工作,即使插入了耳机,普通扬声器也可以。

react-native-incall-manager 建议使用 react-native 中的 DeviceEventEmitter 来检测连接的音频设备的变化等原生事件,但这个模块是 deprecated

这里推荐使用NativeEventEmitter,但这看起来很复杂,似乎需要编写原生Java(Android)模块并结合使用。

如何在 React Native 中检测 Android 中连接的音频设备的变化?

【问题讨论】:

    标签: android react-native


    【解决方案1】:

    这里推荐使用NativeEventEmitter,但这看起来很复杂,似乎需要编写原生Java(Android)模块并结合使用。

    您不需要为此作业编写本机 Java 模块,因为 NativeEventEmitter 可以接收通过 RCTDeviceEventEmitter 发送的事件。

    react-native-incall-manager README 中的示例

    import { DeviceEventEmitter } from 'react-native';
    
    DeviceEventEmitter.addListener('Proximity', function (data) {
        // --- do something with events
    });
    

    可以很容易地改写成这个

    import { NativeEventEmitter, NativeModules } from 'react-native';
    
    const eventEmitter = new NativeEventEmitter(NativeModules.InCallManager);
    eventListener = eventEmitter.addListener('Proximity', event => {
      // do something with events
    });
    

    一旦不再需要事件侦听器,别忘了清理

    eventListener.remove();
    

    如果您想检测连接的音频设备的变化,您可以从react-native-incall-manager 订阅onAudioDeviceChanged 事件。 每当连接的音频设备或输出声音的设备发生变化时,它就会发送类似的信息

    {"availableAudioDeviceList": "[\"BLUETOOTH\",\"SPEAKER_PHONE\",\"EARPIECE\"]", "selectedAudioDevice": "EARPIECE"}
    

    【讨论】:

    • 感谢您的回答,我会尽快实现这一点
    猜你喜欢
    • 2011-09-09
    • 2023-03-20
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2012-05-27
    • 1970-01-01
    • 2015-12-22
    相关资源
    最近更新 更多