我正在编写一个 Android 应用程序,它从蓝牙设备接收信息。我们的客户建议蓝牙设备(他们生产的)将根据某些条件更改其名称 - 举个最简单的例子,其名称有时是“xxx-ON”,有时是“xxx-OFF”。我的应用程序只是应该寻找这个 BT 发射器(我使用 BluetoothAdapter.startDiscovery() )并根据它找到的名称执行不同的操作。我没有与蓝牙设备配对(尽管我认为这可能是可能的,但该应用程序最终应该与多个 Android 设备和多个 BT 发射器配合使用,所以我不确定这是否是一个好主意)。
我的代码可以很好地检测 BT 设备并找到它们的名称。另外,如果设备关闭,我可以在下次搜索时检测到它不在那里。但似乎如果它在那里并且它改变了名称,我会选择旧名称 - 大概它被缓存在某个地方。即使蓝牙设备关闭,并且我们注意到,下次检测到它时,我仍然会看到旧名称。
我在谷歌代码中发现了这个问题:here但我什至不清楚如何使用给出的解决方法(“尝试连接”)。有人这样做过并且运气好吗?你能分享代码吗?
有没有一种简单的方法可以删除缓存的名称并再次搜索,以便我始终找到最新的名称?即使是一种不简单的方法也会很好(我正在为 root 设备编写)。
Thanks
我建议使用“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。
让我知道这是否有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)