2011-03-15 18 views
18

Estoy buscando la manera de conectar el zócalo rfcomm de forma insegura. Pude encontrar el camino mencionado a continuaciónCómo crear un socket RFCOMM inseguro en Android?

Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class}); 
tmp = (BluetoothSocket) m.invoke(device, 1); 

Por el momento, estoy haciendo lo que quiero. Incluso la documentación sobre here dice que necesitamos usar createInsecureRfcommSocketToServiceRecord para conexiones inseguras. Pero no hay tal método. La única forma en que descubrí fue usando la reflexión como se muestra arriba. E incluso en eso, el método que se pasa en createInsecureRfcommSocket y no createInsecureRfcommSocketToServiceRecord. Solo quería saber qué tan confiable es de esta manera. Si menciono createInsecureRfcommSocketToServiceRecord en el método, la conexión nunca ocurre.

Respuesta

29

createInsecureRfcommSocketToServiceRecord() se incluyó a partir de Android API nivel 10, por lo que la documentación le anime a usarlo ya que los documentos siguen siempre la última versión de la API. Si tiene como objetivo una API inferior a 10 (por ej., 2.3.3 o Gingerbread), ese método no será accesible para usted.

El método que está llamando a través de la reflexión createInsecureRfcommSocket() es un método privado dentro de BluetoothDevice que ha estado presente desde aproximadamente Android 2.0. El problema de llamar a métodos ocultos es que no está garantizado que estén allí en todos los dispositivos, o en el futuro ... así que estás jugando un poco. Supongo que su método probablemente funcionará la mayor parte del tiempo en la mayoría de los dispositivos 2.0+, ya que los servicios necesarios para implementar su primo público createRfcommSocketToServiceRecord() son muy similares en la capa de la pila.

En pocas palabras, si quiere una compatibilidad universal garantizada con su implementación Bluetooth, tendrá que apuntar a 2.3.3 (Nivel API 10) con su aplicación. Con una API pública ahora expuesta para RFCOMM inseguro, es difícil decir si es más o menos probable que cambie la implementación privada subyacente.

+0

Muchas gracias por indicarme la dirección correcta. Si esa API está disponible solo desde el nivel 10 de la API, entonces ¿cómo me conecto a los dispositivos de forma insegura? Si estoy desarrollando un ATM con Android 2.1 – sunil

+3

, ha encontrado el mejor compromiso. Solo tenga en cuenta que la solución de reflexión puede desaparecer en versiones posteriores, por lo que puede escribir su código para verificar la versión en el dispositivo con 'Build.VERSION' y usar la API pública para 2.3 y versiones posteriores.Esto requerirá que aumente su Nivel de API objetivo a 10, pero deje su Nivel mínimo de API en 5 (o 7), de modo que seguirá ejecutándose en dispositivos anteriores que ejecuten 2.1 o 2.2. ¡Espero que ayude! – Devunwired

+0

@Wireless, pero ¿funcionará con el método createInsecureRfcommSocketToServiceRecord() en API 7? –

0
+0

@ Mr Dennis Mathews, necesito que eche un vistazo a este enlace –

+0

http://stackoverflow.com/questions/6872451/android-bluetooth-connection-issue –

5

La mayoría de las respuestas respondidas aquí son anteriores al 30 de marzo de 2011 en esta publicación.

bien en busca de la solución de un problema similar en mi aplicación, he encontrado este blog escrito el 30 de marzo

Esto ayudará a todos aquellos que todavía están en busca de esta solución en un problema SO

http://mobisocial.stanford.edu/news/2011/03/bluetooth-reflection-and-legacy-nfc/

La solución se ha vuelto muy simple ahora. Simplemente incluya InsecureBluetooth.java en su proyecto y cambie 2 líneas en BluetoothChatService.java.

tmp = InsecureBluetooth.listenUsingRfcommWithServiceRecord(mAdapter, NAME, MY_UUID, true); 

y

tmp = InsecureBluetooth.createRfcommSocketToServiceRecord(device, MY_UUID, true); 

Eso es todo!

+4

el enlace es 404 – Rafay

Cuestiones relacionadas