example - configurar bluetooth android
BluetoothServerSocket accept falla y arroja una IOException (1)
Finalmente lo resolví, el problema es que diferentes versiones de Android y diferentes dispositivos parecen necesitar diferentes sockets. Lo probé con Samsung Galaxy XCOVER, Tab1, Tab2, Nexus, Note, Motorola Defy y HTC Flyer. Los zócalos que utilicé son:
UN:
Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
mSocket = (BluetoothSocket) m.invoke(mmDevice, Integer.valueOf(1));
SEGUNDO:
Method m = mmDevice.getClass().getMethod("createInsecureRfcommSocket", new Class[]{int.class});
mSocket=(BluetoothSocket)m.invoke(mmDevice,Integer.valueOf(1));
DO:
mSocket=BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mmDevice.getAddress()).createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
Android 4.0.x funciona para Nexus, Flyer, Tab1 con A, B Android 4.0.3 funciona para Tab2 con B Android 3,6, x funciona para DEFY con A, B Android 2.3.6 funciona para XCOVER con C
No puedo encontrar una solución que funcione para todos los dispositivos y no puedo descubrir que el socket de witch funcionará antes de crear y usar Socket, especialmente XCOVER realizar connect () para todos los Sockets sin lanzar una excepción, pero atrapar si pruebo tro write (). Entonces, si desea configurar una conexión bloothoh que funcione para todos los dispositivos, debe crear los enchufes, conectar una escritura y luego recordar el conector que funciona (por ejemplo, en las preferencias)
Tengo un dispositivo que admite OBEX Object Push Profile, este perfil se basa en el perfil del puerto serie. Creo que puedo usar el ejemplo de Android Bluetooth Chat para conectar este dispositivo a mi teléfono Android. Pero me encontré con un problema relacionado con la funcionalidad de socket.accept()
en el SDK de Android. Intento lograr conectar mi teléfono con este dispositivo así:
adapter = BluetoothAdapter.getDefaultAdapter();
device = adapter.getRemoteDevice("00:1B:DC:0F:EC:7E");
AcceptThread = new AcceptThread(true, adapter, device);
AcceptThread.start();
El constructor en AcceptThread está codificado así:
public AcceptThread(boolean secure, BluetoothAdapter adapter, BluetoothDevice device) {
BluetoothServerSocket tmp = null;
this.adapter = adapter;
this.device = device;
// Create a new listening server socket
try {
tmp = adapter.listenUsingInsecureRfcommWithServiceRecord(device.getName(), UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
} catch (Exception e) {
Log.e(TAG, ".AcceptThread # listen() failed", e);
}
mmServerSocket = tmp;
}
El problema es cuando trato de hacer una connect()
como dije antes
public void run() {
BluetoothSocket socket = null;
// Listen to the server socket if we''re not connected
while (mState != STATE_CONNECTED) {
try {
// This is a blocking call and will only return on a
// successful connection or an exception
Log.d(TAG, "AcceptThread.run: accepting server socket connection");
socket = mmServerSocket.accept(20000);
Log.d(TAG, ".AcceptThread.run # server socket connection accepted");
} catch (Exception e) {
Log.e(TAG, ".run # accept() failed: "+e);
break;
}
}
}
Como puede ver, ServerSocket acepta todas las conexiones entrantes durante 20 seconds
o 20000 ms.
Cuando se acabe el tiempo, la aplicación lanzará una IOException como esta
07-11 10:30:08.355: E/SIMPLECONNECT(1301): .run # accept() failed: java.io.IOException: Connection timed out
que me dice que mi dispositivo no se pudo conectar a mi teléfono Android. El dispositivo no tiene un botón de conexión en la pantalla, solo una funcionalidad de envío que enviará un archivo a mi teléfono. Creo que esta funcionalidad de envío también hace una conexión en segundo plano, pero no estoy seguro.
¿Alguien puede encontrar soluciones para mí? Estoy ejecutando mi aplicación en un Samsung Galaxy SIII
con Android 4.0.4