|
BUT提交
1.测试平台:安卓手机(MATE40,荣耀30,小米、荣耀20、苹果)
2.模块名称:ble
3.问题描述:1)当App安装在MATE40,荣耀30手机上,使用ble模块scan周围的蓝牙设备,搜索不到。
2)当App安装在小米、荣耀20、苹果手机上,使用ble模块scan周围的蓝牙设备,可以搜索到。
3)补充说明:App权限已全部手工打开、requestBlePermission已执行、targetSdkVersion=31。
4.代码截图:
//蓝牙初始化 -- 可外部调用
function bleInit()
{
//1.变量初始化
m_ble = api.require('ble');
m_sysType = api.systemType;
//2.定时器初始化
bleTimerInit();
//3.安卓支持先打开蓝牙开关,再初始化本地蓝牙
if (m_sysType == "android")
{
m_ble.requestBlePermission(); //2023-06-05
m_ble.openBluetooth(evtBleOpenBletooth);
}
//3.苹果不支持先打开蓝牙开关,只能直接初始化本地蓝牙
else
{
m_ble.initManager(evtBleInitManager);
}
}
//事件-打开本地蓝牙-Android
function evtBleOpenBletooth(ret)
{
if (ret == null || ret.status == null)
{
return;
}
//1.如果打开本地蓝牙成功,那么初始化本地蓝牙
if (ret.status == true)
{
m_ble.initManager(evtBleInitManager);
}
//1.如果打开本地蓝牙失败,那么提示失败
else
{
m_bleState = STATE_NONE;
api.sendEvent({name:"msgBleStateChange", extra:{type:"init", state:m_bleState, value:"蓝牙打开失败"}});//界面交互
}
}
//事件-初始化本地蓝牙
function evtBleInitManager(ret)
{
if (ret == null || ret.state == null)
{
return;
}
//1.如果打开本地蓝牙成功,那么开始扫描附近蓝牙设备
if (ret.state == "poweredOn")
{
m_bleState = STATE_INIT_OK;
api.sendEvent({name:"msgBleStateChange", extra:{type:"init", state:m_bleState, value:""}});//界面交互
bleScanStart();
}
//1.如果打开本地蓝牙失败,那么提示失败
else
{
m_bleState = STATE_NONE;
api.sendEvent({name:"msgBleStateChange", extra:{type:"init", state:m_bleState, value:"蓝牙初始化失败"}});//界面交互
}
}
//启动扫描附近蓝牙设备 -- 可外部调用
function bleScanStart()
{
//1.如果初始化未成功,那么提示失败
if (m_bleState == STATE_NONE)
{
api.sendEvent({name:"msgBleStateChange", extra:{type:"scan", state:m_bleState, value:"请先打开蓝牙开关并授权蓝牙"}});//界面交互
return;
}
//2.断开之前的连接
bleDisConnect();
//3.启动扫描附近蓝牙设备
//m_ble.discovery(evtBleScanStart);
m_ble.scan({clean:true}, evtBleScanStart);
}
//事件-启动扫描附近蓝牙设备
function evtBleScanStart(ret)
{
if (ret == null || ret.status == null)
{
return;
}
//1.如果启动扫描附近蓝牙设备成功,那么开始定时器、置扫描中标志
if (ret.status == true)
{
m_bleState = STATE_SCANING;
api.sendEvent({name:"msgBleStateChange", extra:{type:"scan", state:m_bleState, value:""}});//界面交互
m_scanMSecs = new Date().getTime();
m_periMSecs = new Date().getTime();
}
//1.如果启动扫描附近蓝牙设备失败,那么提示失败
else
{
m_bleState = STATE_SCAN_ERR;
api.sendEvent({name:"msgBleStateChange", extra:{type:"scan", state:m_bleState, value:"扫描附近蓝牙设备失败"}});//界面交互
}
}
//获取扫描到的附近蓝牙设备信息
function getBlePeripheral()
{
//1.如果初始化未成功,那么提示失败
if (m_bleState == STATE_NONE)
{
api.sendEvent({name:"msgBleStateChange", extra:{type:"peri", state:m_bleState, value:"请先打开蓝牙开关并授权蓝牙"}});//界面交互
return;
}
//2.获取扫描到的附近蓝牙设备信息
m_ble.getPeripheral(evtGetBlePeripheral);
}
//事件-获取扫描到的附近蓝牙设备信息
function evtGetBlePeripheral(ret)
{
if (ret == null || ret.peripherals == null)
{
return;
}
//问题在此处 ret.peripherals.length 是 0
//2.记录附近蓝牙设备信息
m_blePeripherals = ret.peripherals;
api.sendEvent({name:"msgBleStateChange", extra:{type:"peri", state:m_bleState, value:ret.peripherals}});//界面交互
}
//事件-定时器
function evtBleTimer()
{
var currMSecs = new Date().getTime();
if (m_bleState == STATE_SCANING)
{
//定时获取扫描的附近设备信息
if (Math.abs(currMSecs - m_periMSecs) >= 1000)
{
m_periMSecs = currMSecs;
getBlePeripheral();
}
//扫描超时结束
if (Math.abs(currMSecs - m_scanMSecs) >= 5000)
{
m_scanMSecs = currMSecs;
m_bleState = STATE_SCAN_OK;
bleScanStop();
}
}
}
|
-
-
|