1

我正在编写一个从蓝牙设备接收信息的 Android 应用程序。我们的客户建议蓝牙设备(他们生产的)将根据某些条件更改其名称 - 最简单的示例,它的名称有时是“xxx-ON”,有时是“xxx-OFF”。我的应用程序只是应该寻找这个 BT 发射器(我使用 BluetoothAdapter.startDiscovery() )并根据它找到的名称做不同的事情。我没有与蓝牙设备配对(尽管我认为它可能是可能的,该应用程序最终应该可以与多个 Android 设备和多个 BT 发射器一起使用,所以我不确定这是否是一个好主意)。

我的代码可以很好地检测 BT 设备并找到它们的名称。此外,如果设备关闭,我可以在下次搜索时检测到它不存在。但似乎如果它在那里并且它改变了名称,我会选择旧名称 - 大概它被缓存在某个地方。即使蓝牙设备关闭,我们注意到,下次我检测到它时,我仍然会看到旧名称。

我在 Google Code: here中发现了这个问题,但我什至不清楚如何使用给定的解决方法(“尝试连接”)。有没有人这样做并且有运气?可以分享代码吗?

有没有一种简单的方法可以删除缓存的名称并再次搜索,这样我总能找到最新的名称?即使是一种非简单的方法也很好(我正在为有根设备编写)。

谢谢

4

1 回答 1

2

我会建议“fetchUuidsWithSdp()”。其意义在于,与类似的 getUuids() 方法不同,fetchUuidsWithSdp 会导致设备更新有关远程设备的缓存信息。我相信这包括远程名称以及 SPD。

请注意,我提到的两种方法在 4.0.3 之前都是隐藏的,因此您的代码看起来像这样:

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。

让我知道这是否有帮助。

于 2012-04-16T15:30:53.340 回答