1. 在开发BLE之前,需要先申请相关权限,否则初始化蓝牙的时候,会返回错误码10001。授权相关可参考文档:
1)检查该权限是否申请 wx.getSetting
2)如果没有,调用接口申请权限 wx.authorize
3)如果用户点击拒绝,弹出提示框,让用户在小程序设置中打开对应的权限
3. 代码实现
1)我在index目录下新增了一个permisson.js文件,专门用来请求权限和检测权限
/**
* 检测是否有对应的权限,通过回调函数返回结果
* @param {String} perName 权限名称
* @param {function} perResultCbFun 结果回调函数,参数为true表示成功
*/
function permission_check(perName, perResultCbFun) {
// var arr = (typeof perArr != "object") ? [perArr] : perArr; // 确保参数总是数组
wx.getSetting({
success(res) {
if (!res.authSetting[perName]) {
if (typeof perResultCbFun == "function") {
console.log("授权状态获取失败", perName);
perResultCbFun(false);
}
} else {
if (typeof perResultCbFun == "function") {
console.log("授权状态获取成功", perName);
perResultCbFun(true);
}
}
},
fail(res) {
console.log("授权状态获取失败", perName);
if (typeof perResultCbFun == "function") {
perResultCbFun(false);
}
}
})
}
申请权限
/**
* 请求对应的权限
* @param {String} perName 权限名称
* @param {String} perZhName 权限对应的中文名称,用来做提示用
* @param {function} perRequestCbFun 请求结果回调(参数为true表示成功)
*/
function permission_request(perName, perZhName, perRequestCbFun) {
permission_check(perName,
(perCheckResualt) => {
if (perCheckResualt) { // 权限已经请求成功
if (typeof perRequestCbFun == "function") {
perRequestCbFun(true);
}
} else {
// 如果没有该权限,就去申请该权限
wx.authorize({
scope: perName,
success () {
// 用户已经同意小程序使用ble,后续调用 wx.startRecord 接口不会弹窗询问
if (typeof perRequestCbFun == "function") {
perRequestCbFun(true);
}
},
fail() {
// 用户拒绝授予权限
console.log("用户拒绝授权", perName);
// 弹出提示框,提示用户需要申请权限
wx.showModal({
title: '申请权限',
content: '需要使用'+perZhName+'权限,请前往设置打开权限',
success(res) {
if (res.confirm) {
console.log('用户点击确定');
// 打开权限设置页面,即使打开了权限界面,也不知道用户是否打开了权限,所以这里返回失败
wx.openSetting({
success(res) {
if (typeof perRequestCbFun == "function") {
perRequestCbFun(false);
}
},
fail(err) {
if (typeof perRequestCbFun == "function") {
perRequestCbFun(false);
}
}
})
} else if (res.cancel) {
if (typeof perRequestCbFun == "function") {
perRequestCbFun(false);
}
}
}
})
}
})
}
}
)
}
导出这两个接口,否则其他js文件没有办法调用到
module.exports = {
permission_check,
permission_request
}
在index.js引用该文件,并在页面加载的时候,申请权限
var permisson = require('permission.js');
const blePermissionName = 'scope.bluetooth'; // 蓝牙对应的权限名称
const blePermissionZhName = '蓝牙'; // 蓝牙权限对应的中文名称
onLoad() {
//请求相关权限
permisson.permission_request(blePermissionName, blePermissionZhName);
},
实际效果:
1)用户第一次进入小程序,会弹出请求权限的提示框
2)如果用户点击拒绝,会弹出请求打开设置
3)如果用户点击确认,就会进入到小程序设置页面