微信小程序实现蓝牙开启自动播放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.pswp.cn/web/93786.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93786.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XML 序列化与操作详解笔记

一、XML 基础概念XML&#xff08;eXtensible Markup Language&#xff0c;可扩展标记语言&#xff09;是一种用于存储和传输数据的标记语言&#xff0c;由 W3C 制定&#xff0c;具有以下特点&#xff1a;可扩展性&#xff1a;允许自定义标记&#xff08;如<Student>、<…

第八十四章:实战篇:图 → 视频:基于 AnimateDiff 的视频合成链路——让你的图片“活”起来,瞬间拥有“电影感”!

AI图生视频前言&#xff1a;从“刹那永恒”到“动态大片”——AnimateDiff&#xff0c;让图片“活”起来&#xff01;第一章&#xff1a;痛点直击——静态图像到视频&#xff0c;不是“幻灯片”那么简单&#xff01;第二章&#xff1a;探秘“时间魔法”&#xff1a;AnimateDiff…

2025深大计算机考研复试经验贴(已上岸)

如果你在初试出分前看到此贴 我建议&#xff1a; 准备机试和简历&#xff0c;即使你不估分&#xff1a;因为如果要准备春招的话&#xff0c;也总要刷题和做简历的。尽早估分&#xff0c;查一下往年的复试线&#xff0c;如果有望进复试&#xff0c;可尽早开始准备。 Preface …

用Pygame开发桌面小游戏:从入门到发布

一、引言 Pygame是一个基于Python的跨平台游戏开发库,它提供了简单易用的图形、声音和输入处理功能,非常适合新手入门游戏开发。本文将以"经典游戏合集"项目为例,带你一步步了解如何使用Pygame开发、打包和发布自己的桌面小游戏。 二、开发环境搭建 安装Python:…

CSS backdrop-filter:给元素背景添加模糊与色调的高级滤镜

在现代网页设计中&#xff0c;半透明元素搭配背景模糊效果已成为流行趋势 —— 从毛玻璃导航栏、模态框遮罩&#xff0c;到卡片悬停效果&#xff0c;这种设计能让界面更具层次感和高级感。实现这一效果的核心 CSS 属性&#xff0c;正是backdrop-filter。它能对元素背后的内容&a…

检索增强生成(RAG) 缓存增强生成(CAG) 生成中检索(RICHES) 知识库增强语言模型(KBLAM)

以下是当前主流的四大知识增强技术方案对比&#xff0c;涵盖核心原理、适用场景及最新发展趋势&#xff0c;为开发者提供清晰的技术选型参考&#xff1a; &#x1f50d; 一、RAG&#xff08;检索增强生成&#xff09;​​ 核心原理​&#xff1a; 动态检索外部知识库&#xff0…

LLM(大语言模型)的工作原理 图文讲解

目录 1. 条件概率&#xff1a;上下文预测的基础 2. LLM 是如何“看着上下文写出下一个词”的&#xff1f; 补充说明&#xff08;重要&#xff09; &#x1f4cc; Step 1: 输入处理 &#x1f4cc; Step 2: 概率计算 &#x1f4cc; Step 3: 决策选择 &#x1f914; 一个有…

Python netifaces 库详解:跨平台网络接口与 IP 地址管理

一、前言 在现代网络编程中&#xff0c;获取本机的网络接口信息和 IP 配置是非常常见的需求。 例如&#xff1a; 开发一个需要选择合适网卡的 网络服务&#xff1b;在多网卡环境下实现 流量路由与控制&#xff1b;在系统诊断工具中展示 IP/MAC 地址、子网掩码、默认网关&#x…

HTML应用指南:利用POST请求获取上海黄金交易所金价数据

上海黄金交易所&#xff08;SGE&#xff09;作为中国唯一经国务院批准、专门从事黄金等贵金属交易的国家级市场平台&#xff0c;自成立以来始终秉持“公开、公平、公正”的原则&#xff0c;致力于构建规范、高效、透明的贵金属交易市场体系。交易所通过完善的交易机制、严格的风…

C++常见面试题-1.C++基础

一、C 基础 1.1 语言特性与区别C 与 C 的主要区别是什么&#xff1f;C 为何被称为 “带类的 C”&#xff1f; 主要区别&#xff1a;C 引入了面向对象编程&#xff08;OOP&#xff09;特性&#xff08;类、继承、多态等&#xff09;&#xff0c;而 C 是过程式编程语言&#xff1…

Tomcat里catalina.sh详解

在 Tomcat 中&#xff0c;catalina.sh&#xff08;Linux/macOS&#xff09;或 catalina.bat&#xff08;Windows&#xff09;是 核心的启动和关闭脚本&#xff0c;用于控制 Tomcat 服务器的运行。它是 Tomcat 的“主控脚本”&#xff0c;负责设置环境变量、启动/关闭 JVM 进程&…

STM32之MCU和GPIO

一、单片机MCU 1.1 单片机和嵌入式 嵌入式系统 以计算机为核心&#xff0c;tips&#xff1a;计算机【处理单元&#xff0c;内存 硬盘】 可以控制的外部设备&#xff0c;传感器&#xff0c;电机&#xff0c;继电器 嵌入式开发 数据源--> 处理器(CPU MCU MPU) --> 执行器 …

22_基于深度学习的桃子成熟度检测系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)

目录 项目介绍&#x1f3af; 功能展示&#x1f31f; 一、环境安装&#x1f386; 环境配置说明&#x1f4d8; 安装指南说明&#x1f3a5; 环境安装教学视频 &#x1f31f; 二、数据集介绍&#x1f31f; 三、系统环境&#xff08;框架/依赖库&#xff09;说明&#x1f9f1; 系统环…

数据结构:二叉树oj练习

在讲今天的题目之前&#xff0c;我们还需要讲一下二叉树的以下特点&#xff1a; 对任意一颗二叉树&#xff0c;如果度为0的节点个数是n0&#xff0c;度为2的节点个数是n2&#xff0c;则有n0n21. 证明&#xff1a;二叉树总的节点个数是n&#xff0c;那么有nn0n1n2 二叉树的度为…

RabbitMQ高级特性——TTL、死信队列、延迟队列、事务、消息分发

目录 一、TTL 1.1设置消息的TTL 1.2设置队列的TTL 1.3两者之间的区别 二、死信队列 2.1死信的概念 2.2死信产生的条件&#xff1a; 2.3死信队列的实现 死信队列的工作原理 2.4常⻅⾯试题 三、延迟队列 3.1概念 3.2应用场景 3.3RabbitMQ 实现延迟队列的核心原理 1…

神经网络设计中关于BN归一化(Normalization)的讨论

在神经网络的结构中&#xff0c;我们常常可以看见归一化&#xff08;Normalization&#xff09;如BN的出现&#xff0c;无论是模型的backbone或者是neck的设计都与它有着重大的关系。 因此引发了我对它的思考&#xff0c;接下来我将从 是什么&#xff08;知识领域&#xff0c;诞…

MacOS 安全机制与“文件已损坏”排查完整指南

1. 背景说明macOS 为了保护系统安全&#xff0c;内置了多个安全机制&#xff1a;机制作用是否影响第三方 AppSIP (System Integrity Protection)保护系统关键文件/目录不被篡改高风险 App/驱动可能受限Gatekeeper限制未签名/未认证 App 运行阻止“未知开发者” App文件隔离属性…

package.json文件中的devDependencies和dependencies对象有什么区别?

前端项目的package.json文件中&#xff0c;dependencies和devDependencies对象都用于指定项目所依赖的软件包&#xff0c;但它们在项目的开发和生产环境中的使用有所不同。1.dependencies&#xff1a;dependencies是指定项目在生产环境中运行所需要的依赖项。这些依赖项通常包括…

【最新版】CRMEB Pro版v3.4系统源码全开源+PC端+uniapp前端+搭建教程

一.系统介绍 crmebPro版 v3.4正式发布&#xff0c;智能任务推送、动态标签管理、商城AI生产力&#xff0c;焕然一新&#xff0c;不负期待&#xff01;页面DIY设计功能全面升级&#xff0c;组件更丰富&#xff0c;样式设计更全面&#xff1b;移动端商家管理&#xff0c;让商城管…

AI 浪潮下 IT 从业者的职业展望:替代之惑与转型之道

一、引言1.1 科技变革的浪潮&#xff1a;AI 崛起与 IT 行业震荡在当今科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;无疑是最具影响力的变革力量之一。从实验室的前沿研究到广泛的商业应用&#xff0c;AI 以惊人的速度渗透到各个领域&#xff0c;彻底改变…