如何防止名称缓存和检测发现上蓝牙名称变更(How to prevent name caching a

2019-06-23 16:33发布

我正在写一个Android应用程序从一个蓝牙设备接收信息。 我们的客户建议,蓝牙设备(他们生产)将根据一定的条件下改变其名称 - 最简单的例子它的名字有时会“XXX-ON”,有时“XXX-OFF”。 我的应用程序只应该寻求这个蓝牙发射器(我用BluetoothAdapter.startDiscovery()),并做取决于它找到的名称不同的事情。 我不与蓝牙设备配对(虽然我认为这是可能的,应用程序应该最终与多台Android设备和多个BT发射机工作,所以我不知道这将是一个不错的主意)。

我的代码工作正常,检测BT设备,并找到他们的名字。 另外,如果设备熄灭,我可以检测下一次我求,这是不存在的。 但似乎如果它是存在的,它改变了名字,我拿起旧名 - 大概是缓存的地方。 即使蓝牙设备熄灭,我们注意到,下一次我发现,我还是看到了旧名。

我发现这个问题在谷歌代码: 在这里 ,但我不清楚,甚至如何使用给出的解决方法(“尝试连接”)。 有没有人这样做,任何运气? 你能共享代码?

有没有一种简单的方法,只是删除缓存的名字并重新搜索,所以我总能找到最新的名字呢? 即使是一个非简单的方法将是很好(我写一个根深蒂固设备)。

谢谢

Answer 1:

我建议 'fetchUuidsWithSdp()'。 它的意义在于,不像类似getUuids()方法,fetchUuidsWithSdp导致设备更新有关远程设备缓存信息。 我相信这包括远程名称以及社民党。

注意,这两个我提到是隐藏之前4.0.3的方法,让你的代码看起来升IKE在此:

public static void startServiceDiscovery( BluetoothDevice device ) {
    // Need to use reflection prior to API 15
    Class cl = null;
    try {
        cl = Class.forName("android.bluetooth.BluetoothDevice");
    } catch( ClassNotFoundException exc ) {
        Log.e(CTAG, "android.bluetooth.BluetoothDevice not found." );
    }
    if (null != cl) {
        Class[] param = {};
        Method method = null;
        try {
            method = cl.getMethod("fetchUuidsWithSdp", param);
        } catch( NoSuchMethodException exc ) {
            Log.e(CTAG, "fetchUuidsWithSdp not found." );
        }
        if (null != method) {
            Object[] args = {};
            try {
                method.invoke(device, args);
            } catch (Exception exc) {
                Log.e(CTAG, "Failed to invoke fetchUuidsWithSdp method." );
            }               
        }
    }
}

然后,您将需要监听BluetoothDevice.ACTION_NAME_CHANGED意图,并从中提取BluetoothDevice.EXTRA_NAME。

让我知道是否有帮助。



文章来源: How to prevent name caching and detect bluetooth name changes on discovery