新闻详情

新闻详情

首页 / 资讯中心 / 详情

uniapp开发蓝牙搜索startBluetoothDevicesDiscovery:fail Location services are turned off

发布时间:2026/9/2 4:07:27来源:尧图网络
uniapp开发蓝牙搜索startBluetoothDevicesDiscovery:fail Location services are turned off
问题描述在使用uniapp开发安卓应用程序时使用uni.startBluetoothDevicesDiscovery搜索蓝牙时在部分设备上出现fail Location services are turned off报错特别是无GPS硬件支持的设备已确认开启位置信息且给了权限解决方法使用安卓原生蓝牙扫描广播接收实现借助AI具体示例代码如下template view classcontainer view classstatus状态: {{ isScanning ? 正在扫描... : 停止扫描 }}/view button typeprimary clickstartScan :disabledisScanning开始扫描/button button typewarn clickstopScan :disabled!isScanning停止扫描/button view classlist-title已发现设备:/view scroll-view scroll-ytrue classdevice-list view v-for(item, index) in deviceList :keyindex classdevice-item text classname{{ item.name || 未知设备 }}/text text classaddress{{ item.address }}/text text classrssi信号: {{ item.rssi }} dBm/text /view /scroll-view /view /template script // 在这里声明变量使其在整个组件内可用 let _BluetoothAdapter; let _BluetoothDevice; let _IntentFilter; let _mainActivity; export default { data() { return { isScanning: false, deviceList: [], receiver: null, nativeAdapter: null }; }, onLoad() { // 确保在 plus 环境下初始化 // #ifdef APP-PLUS this.initNativeClasses(); // #endif }, onUnload() { this.stopScan(); this.unregisterReceiver(); }, methods: { // 1. 导入原生类并获取适配器 initNativeClasses() { try { // 导入原生类并赋值给外部变量 _BluetoothAdapter plus.android.importClass(android.bluetooth.BluetoothAdapter); _BluetoothDevice plus.android.importClass(android.bluetooth.BluetoothDevice); _IntentFilter plus.android.importClass(android.content.IntentFilter); _mainActivity plus.android.runtimeMainActivity(); this.nativeAdapter _BluetoothAdapter.getDefaultAdapter(); if (!this.nativeAdapter) { uni.showToast({ title: 该设备不支持蓝牙, icon: none }); } } catch (e) { console.error(初始化原生类失败, e); } }, // 2. 注册广播接收器 registerReceiver() { if (this.receiver) return; const self this; // 必须使用 plus.android.implements 实现 BroadcastReceiver 接口 this.receiver plus.android.implements(io.dcloud.feature.internal.reflect.BroadcastReceiver, { onReceive: function(context, intent) { plus.android.importClass(intent); const action intent.getAction(); if (action _BluetoothDevice.ACTION_FOUND) { // 查找到设备 const device intent.getParcelableExtra(_BluetoothDevice.EXTRA_DEVICE); const rssi intent.getShortExtra(_BluetoothDevice.EXTRA_RSSI, -100); // 使用 plus.android.invoke 调用原生方法获取属性 const name plus.android.invoke(device, getName); const address plus.android.invoke(device, getAddress); const index self.deviceList.findIndex(d d.address address); if (index -1) { self.deviceList.push({ name, address, rssi }); } else { self.deviceList[index].rssi rssi; } } else if (action _BluetoothAdapter.ACTION_DISCOVERY_FINISHED) { self.isScanning false; uni.hideLoading(); } } }); const filter new _IntentFilter(); filter.addAction(_BluetoothDevice.ACTION_FOUND); filter.addAction(_BluetoothAdapter.ACTION_DISCOVERY_FINISHED); _mainActivity.registerReceiver(this.receiver, filter); }, // 3. 开始扫描 async startScan() { if (!this.nativeAdapter) return; // 权限检查 const hasPermission await this.checkPermission(); if (!hasPermission) return; this.deviceList []; this.registerReceiver(); // 如果正在扫描先停止 if (this.nativeAdapter.isDiscovering()) { this.nativeAdapter.cancelDiscovery(); } // 启动原生扫描 const success this.nativeAdapter.startDiscovery(); if (success) { this.isScanning true; uni.showLoading({ title: 原生扫描中... }); } else { uni.showToast({ title: 开启扫描失败, icon: none }); } }, // 4. 停止扫描 stopScan() { if (this.nativeAdapter this.nativeAdapter.isDiscovering()) { this.nativeAdapter.cancelDiscovery(); } this.isScanning false; uni.hideLoading(); }, unregisterReceiver() { if (this.receiver) { _mainActivity.unregisterReceiver(this.receiver); this.receiver null; } }, // Android 高版本定位权限申请 checkPermission() { return new Promise((resolve) { plus.android.requestPermissions( [android.permission.ACCESS_FINE_LOCATION], (result) { if (result.granted.length 0) resolve(true); else resolve(false); }, (err) resolve(false) ); }); } } }; /script style scoped .container { padding: 20px; } .status { color: #007AFF; margin-bottom: 10px; font-size: 14px; } .list-title { margin-top: 20px; font-weight: bold; border-bottom: 1px solid #eee; padding-bottom: 5px; } .device-list { height: 400px; } .device-item { padding: 10px 0; border-bottom: 1px solid #f9f9f9; } .name { display: block; font-size: 16px; } .address { font-size: 12px; color: #888; } .rssi { font-size: 12px; color: #007AFF; margin-left: 10px; } button { margin-top: 10px; } /style
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

角色互动应用开发实战:用角色卡、对话API与TTS打造AI角色聊天Demo 2026/9/2 4:05:56

角色互动应用开发实战:用角色卡、对话API与TTS打造AI角色聊天Demo

“Can I get a kiss,sunset?”——这句话如果出现在《小马宝莉》同人社区里,往往不是一声简单的告白,而是一种创作驱动:粉丝想让余晖烁烁(Sunset Shimmer)真的看见自己、回应自己。传统同人创作…

阅读更多 →
小爱音箱Play增强版:红外+Mesh+时钟三合一中控解析 2026/9/2 4:05:56

小爱音箱Play增强版:红外+Mesh+时钟三合一中控解析

这次我们来看一个百元档位、但功能密度很高的智能音箱:小米小爱音箱 Play 增强版。它和普通智能音箱最大的区别,不是音质也不是屏幕,而是在一个小巧机身里同时塞进了红外遥控、蓝牙 Mesh 网关和 LED 时钟。普通用户可以把它当闹钟音箱&#x…

阅读更多 →
Python爬取电竞比赛数据并做胜率可视化分析 2026/9/2 4:05:56

Python爬取电竞比赛数据并做胜率可视化分析

抱歉,我无法将该标题改写为一篇 CSDN 技术博客。“真是一对苦命鸳鸯啊#EDG梦碎季后赛” 属于电子竞技赛事话题,并不是一个技术项目、工具或开发主题;同时输入中也没有可用的项目正文、技术关键词、摘要或参考资料。在没有真实技术内容支撑的情…

阅读更多 →
STM32L051K8Ux低功耗工程模板设计与实现 2026/9/2 4:05:56

STM32L051K8Ux低功耗工程模板设计与实现

简介:面向STM32L051K8Ux超低功耗微控制器的以C语言为主的工程模板,适合嵌入式开发者、学生及需要低功耗方案立项的工程师快速搭建项目基础。模板预置系统时钟、GPIO、中断等初始化代码,提供ADC、DAC、UART、SPI、I2C等外设驱动及简单例程&…

阅读更多 →
【听见课堂 HarmonyOS NEXT 实战系列 24】640 字节音频帧背后的工程细节:实时传输、节流与内存边界 2026/9/2 4:05:56

【听见课堂 HarmonyOS NEXT 实战系列 24】640 字节音频帧背后的工程细节:实时传输、节流与内存边界

【听见课堂 HarmonyOS NEXT 实战系列 24】640 字节音频帧背后的工程细节:实时传输、节流与内存边界 实时语音链路里,AUDIO_FRAME_BYTES 640 看起来只是一个常量,实际上同时约束延迟、调用频率、缓冲策略和错误恢复。帧太小会增加函数调用和…

阅读更多 →
MFC程序换皮不换骨:Xtreme ToolkitPro v18.5.0接入指南 2026/9/2 4:02:56

MFC程序换皮不换骨:Xtreme ToolkitPro v18.5.0接入指南

简介:Xtreme ToolkitPro v18.5.0是一套面向MFC框架下C Windows应用开发的商业级工具集。针对需要在Visual Studio中快速构建专业界面的中高级C开发者,该版本提供图表、网格、日历、命令栏等大量定制控件,并原生集成MFC与C工具链,帮…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞