当前位置: 首页 > news >正文

微信小程序实现蓝牙开启自动播放BGM

下面是一个完整的微信小程序实现方案,当蓝牙设备连接时自动播放背景音乐(BGM)。

实现思路

  1. 监听蓝牙设备连接状态

  2. 当检测到蓝牙设备连接时,自动播放音乐

  3. 当蓝牙断开时,停止音乐播放

  4. 处理相关权限和用户交互

完整代码实现

1. 项目结构

text

/pages/indexindex.jsindex.jsonindex.wxmlindex.wxss

2. index.wxml

xml

<view class="container"><view class="status">当前蓝牙状态: {{bluetoothStatus}}</view><button bindtap="initBluetooth">初始化蓝牙</button><button bindtap="startSearch">搜索设备</button><view class="devices"><block wx:for="{{devices}}" wx:key="deviceId"><view class="device" bindtap="connectDevice" data-device="{{item}}">{{item.name}} ({{item.deviceId}})</view></block></view><audio id="bgm" src="/assets/bgm.mp3" loop></audio>
</view>

3. index.wxss

css

.container {padding: 20px;
}.status {margin: 20px 0;font-size: 16px;color: #333;
}button {margin-bottom: 10px;
}.device {padding: 10px;border: 1px solid #eee;margin-bottom: 5px;
}

4. index.js

javascript

Page({data: {bluetoothStatus: '未初始化',devices: [],connectedDeviceId: null,audioCtx: null},onLoad() {// 创建音频上下文this.setData({audioCtx: wx.createInnerAudioContext()});this.data.audioCtx.src = '/assets/bgm.mp3';this.data.audioCtx.loop = true;// 监听蓝牙适配器状态this.onBluetoothAdapterStateChange();},// 初始化蓝牙initBluetooth() {wx.openBluetoothAdapter({success: (res) => {console.log('蓝牙初始化成功', res);this.setData({ bluetoothStatus: '已初始化,未连接' });this.startBluetoothDevicesDiscovery();},fail: (err) => {console.error('蓝牙初始化失败', err);wx.showToast({title: '请打开手机蓝牙',icon: 'none'});}});},// 开始搜索设备startSearch() {this.startBluetoothDevicesDiscovery();},// 开始发现设备startBluetoothDevicesDiscovery() {wx.startBluetoothDevicesDiscovery({success: (res) => {console.log('开始搜索设备', res);this.onBluetoothDeviceFound();},fail: (err) => {console.error('搜索设备失败', err);}});},// 监听发现新设备事件onBluetoothDeviceFound() {wx.onBluetoothDeviceFound((res) => {const devices = res.devices;console.log('发现新设备', devices);if (devices.length > 0) {this.setData({devices: this.data.devices.concat(devices)});}});},// 连接设备connectDevice(e) {const device = e.currentTarget.dataset.device;const deviceId = device.deviceId;wx.createBLEConnection({deviceId,success: (res) => {console.log('连接成功', res);this.setData({ bluetoothStatus: `已连接: ${device.name}`,connectedDeviceId: deviceId});// 连接成功后播放BGMthis.playBGM();},fail: (err) => {console.error('连接失败', err);}});},// 播放背景音乐playBGM() {this.data.audioCtx.play();wx.showToast({title: '蓝牙已连接,开始播放音乐',icon: 'none'});},// 停止背景音乐stopBGM() {this.data.audioCtx.stop();wx.showToast({title: '蓝牙已断开,停止播放音乐',icon: 'none'});},// 监听蓝牙适配器状态变化onBluetoothAdapterStateChange() {wx.onBluetoothAdapterStateChange((res) => {console.log('蓝牙适配器状态变化', res);if (!res.available) {this.setData({ bluetoothStatus: '蓝牙不可用' });this.stopBGM();} else if (res.discovering) {this.setData({ bluetoothStatus: '正在搜索设备...' });} else {this.setData({ bluetoothStatus: '蓝牙已开启' });}});},// 监听BLE连接状态变化onBLEConnectionStateChange() {wx.onBLEConnectionStateChange((res) => {console.log('BLE连接状态变化', res);if (res.connected) {this.setData({ bluetoothStatus: `已连接: ${res.deviceId}`,connectedDeviceId: res.deviceId});this.playBGM();} else {this.setData({ bluetoothStatus: '蓝牙已断开',connectedDeviceId: null});this.stopBGM();}});},onUnload() {// 页面卸载时停止搜索和断开连接wx.stopBluetoothDevicesDiscovery();if (this.data.connectedDeviceId) {wx.closeBLEConnection({ deviceId: this.data.connectedDeviceId });}wx.closeBluetoothAdapter();// 停止音乐this.data.audioCtx.stop();this.data.audioCtx.destroy();}
});

5. index.json

json

{"usingComponents": {},"requiredBackgroundModes": ["audio", "bluetooth"]
}

关键点说明

  1. 权限配置:

    • app.json中配置requiredBackgroundModes以保证后台运行权限

    • 需要用户授权蓝牙和音频权限

  2. 蓝牙流程:

    • 初始化蓝牙适配器(openBluetoothAdapter)

    • 开始搜索设备(startBluetoothDevicesDiscovery)

    • 监听发现设备(onBluetoothDeviceFound)

    • 连接设备(createBLEConnection)

    • 监听连接状态(onBLEConnectionStateChange)

  3. 音频控制:

    • 使用wx.createInnerAudioContext创建音频上下文

    • 连接成功时调用play()方法

    • 断开连接时调用stop()方法

  4. 用户体验:

    • 显示蓝牙状态变化

    • 连接/断开时有Toast提示

    • 页面卸载时清理资源

注意事项

  1. 真机测试:

    • 此功能必须在真机上测试,开发者工具可能无法完全模拟蓝牙功能

  2. 音频文件:

    • 将背景音乐文件放在/assets/目录下

    • 确保音频文件格式兼容(建议使用mp3格式)

  3. 蓝牙限制:

    • iOS和Android的蓝牙API有差异,需测试兼容性

    • 部分旧机型可能不支持某些蓝牙功能

  4. 后台播放:

    • 小程序进入后台后可能会被暂停,需要合理配置后台运行权限

  5. 用户授权:

    • 首次使用蓝牙功能时需要用户授权

    • 处理用户拒绝授权的场景

这个实现提供了完整的蓝牙连接监听和音频自动播放功能,你可以根据实际需求进一步定制UI和交互逻辑。

http://www.lryc.cn/news/625717.html

相关文章:

  • Java技术总监的成长之路(技术干货分享)
  • CAD图纸如何批量转换成PDF格式?
  • 【动态规划:路径问题】最小路径和 地下城游戏
  • 【网络运维】Ansible roles:角色管理
  • ES支持哪些数据类型,和MySQL之间的映射关系是怎么样的?
  • 点大餐饮独立版系统源码v1.0.3+uniapp前端+搭建教程
  • nuxt使用vue-echarts第三方插件报错document is not defined
  • 亚远景-ISO/PAS 8800认证:从框架到实践的合规路径与挑战
  • 2.Kotlin 集合 List 所有方法
  • Js逆向案例 Scrape Spa2(Webpack自吐)
  • Ansible 大项目管理实践笔记:并行任务、角色管理与负载均衡架构部署
  • 基于Python的宠物服务管理系统 Python+Django+Vue.js
  • 当机器猫遇上具身智能:一款能读懂宠物心思的AI守护者
  • XML 序列化与操作详解笔记
  • Gemini CLI 自定义主题配置
  • 块存储 对象存储 文件存储的区别与联系
  • es9.0.1语义检索简单示例
  • RNN(循环神经网络)和Transformer是处理自然语言处理(NLP)任务区别
  • 《用Proxy解构前端壁垒:跨框架状态共享库的从零到优之路》
  • 高校数字化转型实战:破解数据孤岛、构建智能指标体系与AI落地路径
  • C++代码解释:实现一个 mystring 类,用于表示字符串,实现构造函数,默认构造长度为 10 的空间,提供打印字符串,获取空间大小,修改内容的成员函数
  • InnoDB为什么使用B+树实现索引?
  • Word——正确调整文字与编号的距离
  • 4.Kotlin 集合 Map 所有方法
  • Linux系统安全补丁管理与自动化部署研究与实现(LW+源码+讲解+部署)
  • Ubuntu 20 各种网卡配置IP的方法
  • pnpm 和 npm 差异
  • MySQL 三大日志:redo log、undo log、binlog 详解
  • Git+Jenkins实战(一)
  • 软件测试核心概念拆解:需求、开发模型与测试模型全解析