当前位置: 首页 > 知识库问答 >
问题:

在BluetoothGattCallback上未调用OnServicesDiscovery

姬康平
2023-03-14

我开始使用ibeacon和android。但是有一些问题需要你的帮助。在blutoothGatCallback上,我实现onConnectionStateChange并调用discoverServices()。尽管discoverServices()返回true,但没有任何回调执行,我希望OnServicesDiscovery被调用,但没有。

@Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status,
            int newState) {
        Log.i(TAG, "onConnectionStateChange : " + status + "  newState : "
                + newState);
        if (newState == BluetoothProfile.STATE_CONNECTED) {

            boolean isdiscover= mBluetoothGatt.discoverServices();
            if(isdiscover){
            mConnected = true;              
            }
        } 

    }

状态为133,newstate已连接。状态是否使其无法获取回调

共有2个答案

云承弼
2023-03-14

状态133可以指示您尝试在非主线程上执行bt命令。

BTLE回调是从android-bt-binder线程调用的。

所以

<代码>mBluetoothGatt。discoverServices()

在活页夹线程上运行,它应该在GUI/主线程上运行

邵弘义
2023-03-14

请提供更多信息,您能提供收到的广告数据吗?

以下只是一个猜测,因为Android BLE存在广泛的问题,但是我在意外发出BR/EDR连接到Beacon时已经看到了这个一般的133错误。

由于Android在GATT服务器设备宣布支持BR/EDR连接时默认为BR/EDR连接,因此您可以尝试在connectGatt()中明确设置transport to transport\LE,但由于此参数仅在隐藏版本中可用,因此需要使用反射

尝试这样发出连接:

private BluetoothGatt mGatt;
private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() { ... }

public void connectToDevice(BluetoothDevice device) {
        try {
            Method m = device.getClass().getDeclaredMethod("connectGatt", Context.class, boolean.class, BluetoothGattCallback.class, int.class);
            int transport = device.getClass().getDeclaredField("TRANSPORT_LE").getInt(null);
            mGatt = (BluetoothGatt) m.invoke(device, this, false, gattCallback, transport);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }

这样你至少可以确定它与这种Android行为无关。

 类似资料:
  • 我在一个名为seedrecord的对象和一个名为FielliateLink的对象之间有一个manytomany关系。为了删除FielliateLink,我需要首先从每个SeedRecord的FielliateList中删除对它的引用。之后,我使用spring JParepository的delete方法删除对象。因为我的服务(FiniliateLinkService)中有不同的删除方法,所以我决定

  • 问题内容: 我是spring的新手,我使用https://start.spring.io/创建了一个新的spring boot项目,没有更多依赖关系,解压缩了zip文件并在IntelliJ IDEA中打开了该项目。我没有做任何进一步的配置。我现在正在尝试使用@PostConstruct方法设置bean-但是,该方法从未被spring调用。 这些是我的课程: SpringTestApplicatio

  • 我正在使用JSF 2.0创建页面: 我期待在单击复选框时被调用。但是,加载页面时调用一次setMyCheckboxValue()。 如果我写 每次点击都会收到警报。 我的问题是:当我收到警报时,为什么每次onclick事件都不调用? 注意:我也尝试过AJAX,但复选框保持不变。

  • 问题内容: 我有一个简单的程序,其中显示了一些项目的列表,单击其中的一个后,单击的项目将传递回附件。当用户取消对话框时,我还想执行一些默认处理(使用 后退按钮 )-更具体地说,在这种情况下,我想向活动传递一个空字符串。 但是,如果将对话框放在(来自 兼容性包 )中, 则使用后退按钮关闭对话框时不会调用 。我究竟做错了什么? 问题答案: 这可能与您的代码中没有显式调用的事实有关。该OnCancelL

  • 每当字符串发生更改时,就会调用。 现在,当我启动新的并通过发送数据时,不会被调用。