У меня есть множество устройств, которые не доступны для обнаружения, но я знаю MAC-адреса для них. В настоящее время я могу подключаться к нескольким устройствам с помощью этого в моем ConnectThread:Android - подключение к нескольким устройствам Bluetooth без сопряжения
Method m = device.getClass().getMethod("createRfcommSocket",new Class[] { int.class });
tmp = (BluetoothSocket) m.invoke(device, 1);
Проблема в том, что я хочу, чтобы поддерживать небезопасную RFCOMM устройств, предшествующих 2.3. Я тогда found this на другой ответ, который позволяет мне сделать это вместо того, чтобы:
tmp = InsecureBluetooth.createRfcommSocketToServiceRecord(device,MY_UUID, true);
Который прекрасно работает при подключении к одному устройству без необходимости сопряжения.
Мой вопрос: как я могу получить лучшее из обоих миров и использовать отражение на классе InsecureBluetooth? Или это нужно сделать в классе InsecureBluetooth, и если да, то как? Вот соответствующая часть класса InsecureBluetooth:
private static BluetoothSocket createRfcommSocketToServiceRecord(
BluetoothDevice device, int port, UUID uuid, boolean encrypt)
throws IOException {
try {
BluetoothSocket socket = null;
Constructor<BluetoothSocket> constructor = BluetoothSocket.class
.getDeclaredConstructor(int.class, int.class, boolean.class,
boolean.class, BluetoothDevice.class, int.class, ParcelUuid.class);
if (constructor == null)
throw new RuntimeException("can't find the constructor for socket");
constructor.setAccessible(true);
Field f_rfcomm_type = BluetoothSocket.class
.getDeclaredField("TYPE_RFCOMM");
f_rfcomm_type.setAccessible(true);
int rfcomm_type = (Integer) f_rfcomm_type.get(null);
socket = constructor.newInstance(new Object[] { rfcomm_type, -1, false,
true, device, port, uuid != null ? new ParcelUuid(uuid) : null });
return socket;
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
if (e.getCause() instanceof IOException) {
throw (IOException) e.getCause();
}
throw new RuntimeException(e.getCause());
}
}
public static BluetoothSocket createRfcommSocketToServiceRecord(
BluetoothDevice device, UUID uuid, boolean encrypt) throws IOException {
return createRfcommSocketToServiceRecord(device, -1, uuid, encrypt);
}
public static BluetoothSocket createRfcommSocket(BluetoothDevice device,
int port, boolean encrypt) throws IOException {
return createRfcommSocketToServiceRecord(device, port, null, encrypt);
}
Да, это тот же класс и ссылка, что и я, включенный в мой вопрос. Проблема в том, что когда я выполняю цикл while на каждом устройстве, он переопределяет устройство, с которым я уже подключаюсь, используя этот метод. Я уточню свой вопрос, чтобы объяснить, что я имею в виду. – 7wonders
Я думаю, что вы можете подключиться к одному устройству одновременно для одного и того же профиля Bluetooth. не так ли? – waqaslam
да, но я хочу одновременно подключаться к нескольким устройствам и выполнять поиск данных на каждом из них в фоновом режиме. – 7wonders