更新记录
1.0.3(2025-03-18)
- 优化
1.0.2(2025-03-18)
- 增加AirPods耳机支持
1.0.1(2025-03-12)
- 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)