В нашем случае единственное найденное нами решение, которое могло бы надежно принимать данные Bluetooth OPP с удаленного устройства, заключалось в использовании «скрытого» Android API. Если вы проверяете исходный код Android, то будут определены дополнительные методы, аннотированные @hide
, что исключает их из экспортированного jar-файла Android и документов API.
Следует избегать использования этих методов, если это возможно, и не обязательно быть совместимыми с версиями Android.
Есть два способа включить их в ваш код:
- использовать отражение
- включает дополнительный JAR-файл разработки во время компиляции, который предоставляет эти методы, но убедитесь, что этот JAR-файл не включен в ваше приложение.
Мы выбрали № 1, так как наши требования были минимальными.
Доступ к методу
Class<?>[] args = new Class[] { int.class };
Method listenMethod = BluetoothAdapter.class.getMethod(listenMethod, args);
Где имя метода является одним из (в порядке предпочтения) listenUsingEncryptedRfcommOn
, listenUsingRfcommOn
или listenUsingUnencrytptedRfcommOn
Создать сокет сервера
BluetoothAdapter target = *your adapter, probably the default one*;
BluetoothServerSocket sock = (BluetoothServerSocket) (listenMethod.invoke(target, new Object[] { channel }));
Где в нашем случае канал OPP равен 12
Fin
Если вам удастся получить обратно BluetoothServerSocket
(обработка исключений пропущена, ваш пробег может отличаться, рекомендуется усмотрение пользователя, гарантия не предоставляется и т. Д. И т. Д.), Вы должны иметь возможность использовать его для прослушивания входящих данных OPP.