更新记录

1.0.3(2025-03-18)

  1. 优化

1.0.2(2025-03-18)

  1. 增加AirPods耳机支持

1.0.1(2025-03-12)

  1. iOS增加监听耳机按键事件
查看更多

平台兼容性

Vue2 Vue3
App 快应用 微信小程序 支付宝小程序 百度小程序 字节小程序 QQ小程序
HBuilderX 3.6.8,Android:4.4,iOS:9,HarmonyNext:不支持 × × × × × ×
钉钉小程序 快手小程序 飞书小程序 京东小程序 鸿蒙元服务
× × × × ×
H5-Safari Android Browser 微信浏览器(Android) QQ浏览器(Android) Chrome IE Edge Firefox PC-Safari
× × × × × × × × ×

监听耳机插拔、耳机按键、切换扬声器/耳机、模拟耳机按键

集成步骤:

  • 下载demo示例功能,HBuilderX导入的时候选择vue3(vue2和vue3都支持)
  • 拷贝demo里的Info.plist、AndroidManifest.xml到项目对应到目录
  • 参考https://www.cnblogs.com/wenrisheng/p/18323027集成本插件到项目里

接口文档


import {
    UTSEarphone
} from "@/uni_modules/wrs-uts-earphone"
let earphone = new UTSEarphone()
  • 设置回调

earphone.onCallback((resp) => {
    this.showMsg(JSON.stringify(resp))
    let opt = resp.opt
    switch (opt) {
        // 耳机插拔回调
        case "onEarphone": {
            switch (uni.getSystemInfoSync().platform) {
                case 'android': {
                    var action = resp.action;
                    if (action) {
                        var msg = "";
                        switch (action) {
                            // 蓝牙耳机
                            case "android.bluetooth.headset.profile.action.CONNECTION_STATE_CHANGED":
                                var profileConnectionState = resp.profileConnectionState;
                                switch (profileConnectionState) {
                                    // STATE_DISCONNECTED
                                    case 0:
                                        msg = "蓝牙耳机断开连接";
                                        break;
                                        // STATE_CONNECTING
                                    case 1:
                                        // 鸿蒙os系统已连接也返回1
                                        msg = "蓝牙耳机连接中或已连接...";
                                        break;
                                        // STATE_CONNECTED
                                    case 2:
                                        msg = "蓝牙耳机已经连接";
                                        break
                                        // STATE_DISCONNECTING
                                    case 3:
                                        msg = "蓝牙耳机正在断开连接...";
                                        break
                                }
                                break;
                                // 有线耳机
                            case "android.intent.action.HEADSET_PLUG":
                                if (resp.state) {
                                    if (resp.state == 0) { // 拔出
                                        msg = "有线耳机拔出";
                                    } else if (resp.state == 1) { // 插入
                                        msg = "有线耳机插入";
                                    }
                                }
                                if (resp.microphone) {
                                    if (resp.microphone == 0) { // 没麦克风
                                        msg = "有线耳机没有麦克风";
                                    } else if (resp.microphone == 1) { // 有麦克风
                                        msg = "有线耳机有麦克风";
                                    }
                                }
                                break;
                            case "android.media.AUDIO_BECOMING_NOISY":
                                msg = "有线耳机拔出或蓝牙耳机断开连接";
                                break;
                            default:
                                break;
                        }
                        this.showMsg(msg);
                    }
                }
                break;
                case 'ios': {
                    let AVAudioSessionRouteChangeReason = resp.AVAudioSessionRouteChangeReason
                    switch (AVAudioSessionRouteChangeReason) {
                        // AVAudioSessionRouteChangeReasonUnknown
                        case 0:
                            msg = "AVAudioSessionRouteChangeReasonUnknown";
                            break;
                            // AVAudioSessionRouteChangeReasonNewDeviceAvailable
                        case 1:
                            msg = "连接耳机";
                            break;
                            // AVAudioSessionRouteChangeReasonOldDeviceUnavailable
                        case 2:
                            msg = "拔出耳机";
                            break;
                            // AVAudioSessionRouteChangeReasonCategoryChange
                        case 3:
                            msg = "AVAudioSessionRouteChangeReasonCategoryChange";
                            break;
                            // AVAudioSessionRouteChangeReasonOverride
                        case 4:
                            msg = "AVAudioSessionRouteChangeReasonOverride";
                            break;
                            // AVAudioSessionRouteChangeReasonWakeFromSleep
                        case 6:
                            msg = "AVAudioSessionRouteChangeReasonWakeFromSleep";
                            break;
                            // AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory
                        case 7:
                            msg = "AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory";
                            break;
                            // AVAudioSessionRouteChangeReasonRouteConfigurationChange
                        case 8:
                            msg = "AVAudioSessionRouteChangeReasonRouteConfigurationChange";
                            break;
                        default:
                            break;
                    }
                    this.showMsg(msg);
                }
                break
                default:
                    break;
            }
        }
        break;
        // 耳机按键回调
        case "onEarphoneKey": {
            let str = ""
            switch (uni.getSystemInfoSync().platform) {
                case 'android': {
                    let eventAction = resp.eventAction
                    let keyCode = resp.keyCode
                    switch (eventAction) {
                        // ACTION_DOWN 按下
                        case 0: {
                            switch (keyCode) {
                                case 85: {
                                    str = "点击了播放/暂停"
                                }
                                break;
                                case 87: {
                                    str = "点击了下一首"
                                }
                                break;
                                case 88: {
                                    str = "点击了上一首"
                                }
                                break;
                                case 126: {
                                    str = "点击了播放"
                                }
                                break;
                                case 127: {
                                    str = "点击了暂停"
                                }
                                break;
                                default:
                                    break;
                            }
                        }
                        break;
                        // ACTION_UP 抬起
                        case 1: {

                        }
                        break;
                        // ACTION_MULTIPLE 双击
                        case 2: {

                        }
                        break;
                        default:
                            break;
                    }
                }
                break;
                case 'ios': {
                    let commandType = resp.commandType
                    switch (commandType) {
                        case "previousTrackCommand": {
                            str = "点击了上一首"
                        }
                        break;
                        case "nextTrackCommand": {
                            str = "点击了下一首"
                        }
                        break;
                        case "stopCommand": {
                            str = "点击了停止"
                        }
                        break;
                        case "pauseCommand": {
                            str = "点击了暂停"
                        }
                        break;
                        case "togglePlayPauseCommand": {
                            str = "点击了播放/暂停"
                        }
                        break;
                        case "seekForwardCommand": {
                            str = "点击了快进"
                        }
                        break;

                        default:
                            break;
                    }
                }
                break;
                default:
                    break;
            }
        }
        break;
        // 音频被打断回调,仅支持iOS
        case "onAudioInterruption": {

        }
        break;
        default:
            break;
    }

})
  • 开始监听耳机插拔

earphone.startListen()
  • 取消监听耳机插拔

earphone.stopListen()
  • 开启接收耳机按键,仅支持iOS,经过测试发现AirPods耳机需要调用这个接口才能监听到按键事件

earphone.beginReceivingRemoteControlEvents() 
  • 开始监听耳机按键

earphone.startKeyListen()
  • 取消监听耳机按键

earphone.stopKeyListen()
  • 获取当前音频状态

let result = earphone.getCurState()
console.log(JSON.stringify(result))
switch (uni.getSystemInfoSync().platform) {
    case 'android': {
        var profileConnectionState = result.profileConnectionState
        var isWiredHeadsetOn = result.isWiredHeadsetOn
        var isBluetoothScoOn = result.isBluetoothScoOn
        var isBluetoothA2dpOn = result.isBluetoothA2dpOn
        var msg = "";
        if (isWiredHeadsetOn || isBluetoothScoOn || isBluetoothA2dpOn) {
            msg = "当前有连接耳机";
        } else {
            msg = "当前没有连接耳机";
        }
        this.showMsg(msg);
    }
    break;
    case 'ios': {

        let outputs = result.outputs
        let inputs = result.inputs
        let outputStr = "无"
        let inputStr = "无"
        for (var i = 0; i < outputs.length; i++) {
            var route = outputs[i];
            var portType = route.portType;
            if (portType == "Speaker") { // 没有连接耳机
                outputStr = "扬声器";
            } else if (portType == "BluetoothA2DPOutput") { // 连接的是蓝牙耳机
                outputStr = "连接的是蓝牙耳机";
            } else { // 连接的是有线耳机或其他,这里可以根据各自的连接情况判断对应的值
                outputStr = "连接的是有线耳机或其他";
            }
        }
        for (var i = 0; i < inputs.length; i++) {
            var route = inputs[i];
            var portType = route.portType;
            if (portType == "Speaker") { // 没有连接耳机
                inputStr = "扬声器";
            } else if (portType == "BluetoothA2DPOutput") { // 连接的是蓝牙耳机
                inputStr = "连接的是蓝牙耳机";
            } else { // 连接的是有线耳机或其他,这里可以根据各自的连接情况判断对应的值
                inputStr = "连接的是有线耳机或其他";
            }
        }
        this.showMsg("当前音频输入:" + inputStr + " 输出:" + outputStr)
    }
    default:
        break;
}
  • 切换当前音频输出为扬声器/耳机

let params = {}
params.output = 0 // 0: 耳机  1: 扬声器
earphone.setAudio(params, (resp) => {
    let flag = resp.flag
    if (!flag) {
        this.showMsg("设置失败:" + JSON.stringify(resp))
    }
})
  • 模拟耳机按键,仅支持android

let params = {}
// 24: 音量+ 25: 音量- 164: 静音 85:暂停/播放 127:暂停 126: 播放 88:上一首 87: 下一首
params.keyCode = 24 
earphone.sendKey(params)

隐私、权限声明

1. 本插件需要申请的系统权限列表:

蓝牙

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问