6***@qq.com
6***@qq.com
  • 发布:2023-04-06 11:05
  • 更新:2023-04-06 13:52
  • 阅读:349

【报Bug】BAdapter.startDiscovery() onReceive监听无响应 3.4版没有问题

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: win10

HBuilderX类型: 正式

HBuilderX版本号: 3.7.9

手机系统: Android

手机系统版本号: Android 12

手机厂商: 华为

手机机型: 华为P50E

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

示例代码:
var main = plus.android.runtimeMainActivity();  
    var Context = plus.android.importClass("android.content.Context");  
    var BManager = main.getSystemService(Context.BLUETOOTH_SERVICE);  
    plus.android.importClass(BManager); //引入相关的method函数    
    var BAdapter = BManager.getAdapter();  
    plus.android.importClass(BAdapter); //引入相关的method函数,这样之后才会有isEna    
    var lists = BAdapter.getBondedDevices();  
    console.log(lists)  
    plus.android.importClass(lists);  
    var iterator = lists.iterator();  
    plus.android.importClass(iterator);  
    while (iterator.hasNext()) {  
        var d = iterator.next();  
        plus.android.importClass(d);  
        console.log("名称:" + d.getName() + ",地址:" + d.getAddress());  
    }

操作步骤:

const bluetooth_list = () => {
var main = plus.android.runtimeMainActivity();
var Context = plus.android.importClass("android.content.Context");
var BManager = main.getSystemService(Context.BLUETOOTH_SERVICE);
plus.android.importClass(BManager); //引入相关的method函数
var BAdapter = BManager.getAdapter();
plus.android.importClass(BAdapter); //引入相关的method函数,这样之后才会有isEna
var lists = BAdapter.getBondedDevices();
console.log(lists)
plus.android.importClass(lists);
var iterator = lists.iterator();
plus.android.importClass(iterator);
while (iterator.hasNext()) {
var d = iterator.next();
plus.android.importClass(d);
console.log("名称:" + d.getName() + ",地址:" + d.getAddress());
}
}

预期结果:

获取已经匹配的蓝牙

实际结果:

null

bug描述:

在 3.4版没有问题

在3.5 3.6 3.7 版本以后 BAdapter.getBondedDevices() 就会获取null

2023-04-06 11:05 负责人:无 分享
已邀请:
星拾夜暝

星拾夜暝

首先,我们需要检查一下是否给蓝牙相关的权限。如果没有给予权限的话,那么就会导致onReceive监听无任何响应。因此,在使用BAdapter.startDiscovery()方法之前,我们需要确保已经给予了相应的权限。

其次,我们需要检查一下系统设置,确保蓝牙已经打开。如果蓝牙没有打开,那么onReceive监听同样会无响应。因此,在使用BAdapter.startDiscovery()方法之前,我们需要确保蓝牙已经打开。

最后,我们可以尝试更新一下蓝牙的驱动程序,或者调整一下蓝牙的一些参数。这些操作可能会对onReceive监听产生影响,从而导致无响应的情况。

星拾夜暝

星拾夜暝

如果在3.5、3.6、3.7版本以后,BluetoothAdapter.getBondedDevices()方法返回null,则可能是因为Android更改了该方法的行为。该方法返回的是已配对的蓝牙设备集合,但在某些情况下,它可能返回null。为了解决这个问题,您可以尝试以下几个步骤:

确保您的设备上有已配对的蓝牙设备。如果您的设备没有已配对的蓝牙设备,那么BluetoothAdapter.getBondedDevices()方法将返回一个空的集合。您可以尝试配对一个蓝牙设备,然后再次调用该方法。

尝试使用BluetoothDevice.ACTION_BOND_STATE_CHANGED广播来监听设备配对状态的变化。该广播将在设备配对状态发生变化时发送。您可以使用以下代码注册广播接收器:

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED);  
registerReceiver(receiver, filter);

然后,您可以在onReceive()方法中处理广播:

@Override  
public void onReceive(Context context, Intent intent) {  
    String action = intent.getAction();  
    if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {  
        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);  
        int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR);  
        if (bondState == BluetoothDevice.BOND_BONDED) {  
            // Device is now paired  
        } else if (bondState == BluetoothDevice.BOND_NONE) {  
            // Device is no longer paired  
        }  
    }  
}

注意,您需要根据您的需求修改上述代码。

尝试使用BluetoothDevice.fetchUuidsWithSdp()方法来获取设备的UUID。该方法将触发BluetoothDevice.ACTION_UUID广播,该广播将包含设备的UUID。您可以使用以下代码来获取设备的UUID:
device.fetchUuidsWithSdp();
然后,您可以在onReceive()方法中处理广播:
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_UUID.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Parcelable[] uuids = intent.getParcelableArrayExtra(BluetoothDevice.EXTRA_UUID);
if (uuids != null) {
for (Parcelable uuid : uuids) {
// Do something with the UUID
}
}
}
}
最后,您可以尝试使用不同的API版本。您可以使用以下代码检查您的设备支持的API版本:
int currentApiVersion = android.os.Build.VERSION.SDK_INT;

要回复问题请先登录注册