新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/9/20 0:09:20来源:尧图网络
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

相关资讯

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

较早相关资讯

最新相关资讯

Codex实战:从零编写可靠运维脚本的完整指南 2026/9/20 0:08:14

Codex实战:从零编写可靠运维脚本的完整指南

说实话,我一开始对“AI写脚本”这件事有点不屑。之前也试过在聊天框里让AI生成一段Python,拿到手基本不能用,要么缺依赖、要么参数写死,最后还是自己重写。直到这阵子把 Codex 接进自己的运维工作流,我才改变看法——A…

阅读更多 →
开源CLI代码审查工具:Git+AST+LLM协同的工程化实践 2026/9/20 0:08:14

开源CLI代码审查工具:Git+AST+LLM协同的工程化实践

1. 项目概述:一个真正能落地的开源代码审查 CLI 工具“open-code-review”这个名字乍一听像某个 GitHub 上刚起步的玩具项目,但如果你最近在团队里被 PR 堆得喘不过气、被“已阅”式人工 review 磨掉耐心、或者发现 junior 提交的代码里藏着三个未处理的…

阅读更多 →
Atlassian三件套落地实践:Jira工作流与自动化配置详解 2026/9/20 0:08:14

Atlassian三件套落地实践:Jira工作流与自动化配置详解

很多团队在协作工具选型时,常常陷入“工具很多、方法很乱”的循环里。我们内部代号叫“Atlas”的项目,其实就是围绕 Atlassian 这套生态——Jira 管任务、Confluence 管知识、Bitbucket 管代码——把研发流程重新捋了一遍。这篇文章我会把整个落地过程、…

阅读更多 →
给Homebrew装上图形界面:BrewUI如何解决mac安装报错与卸载残留 2026/9/20 0:08:14

给Homebrew装上图形界面:BrewUI如何解决mac安装报错与卸载残留

我第一次意识到Homebrew需要有个图形界面,是在帮一个从 Windows 转 macOS 的朋友排查安装问题的那天。他发来一大段终端日志,里面全是Error: Permission denied、fatal: not in a git repository,然后问我“这到底什么意思”。我盯着那段日志…

阅读更多 →
Qt国内镜像安装原理与实战:解决下载失败与协议兼容问题 2026/9/20 0:08:14

Qt国内镜像安装原理与实战:解决下载失败与协议兼容问题

1. 项目概述:为什么必须用国内镜像装Qt?这不是“加速”,而是“能装上”的底线你是不是也经历过——打开 qt.io 官网,点开 Downloads 页面,鼠标悬停在「Qt Online Installer」下载按钮上,进度条卡在 2%&…

阅读更多 →
BrewUI:给Homebrew套上图形界面,打造macOS包管理新体验 2026/9/20 0:05:13

BrewUI:给Homebrew套上图形界面,打造macOS包管理新体验

老实说,第一次看到BrewUI这名字的时候,我下意识以为又是某个咖啡机控制面板的 DIY 项目。毕竟 Brew 这词,在手工咖啡圈子里太常见了。结果点进去一查,发现完全不是那么回事——它是冲着 macOS 上那个大名鼎鼎的Homebrew来的&#…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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