Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


El descubrimiento de servicio falló la excepción utilizando Bluetooth en Android

Actualmente estoy trabajando en una aplicación de Android que se conecta a un instrumento a través de Bluetooth y necesito escribir comandos de cadena y recibir respuestas de cadena de nuevo. Actualmente tengo la conexión / lectura / escritura trabajando para TCP / IP a través de Wi-Fi y ahora tratando de implementar Bluetooth. Pero me encuentro con algunos obstáculos. He estado buscando en la web tratando de encontrar ejemplos de algo similar y no han tenido ninguna suerte. He estado usando el ejemplo de recurso de desarrollador de Android: Bluetooth Chat como mi principal punto de referencia.

Mi código actual parece funcionar .. A continuación, lanza una excepción Service Discovery Failed en el punto de la conexión. Estoy usando la clase DeviceListActivity para hacer el descubrimiento y la selección del dispositivo al que quiero conectarme. Devuelve unActivityResult y luego mi clase de Bluetooth espera que se encargue de eso y luego hace la conexión a él. El código de abajo es casi idéntico a la aplicación de chat Bluetooth.

  • Desplome de Android con pantalla de bienvenida translúcida
  • ¿Cuál es la mejor manera de conectarse entre la base de datos de android y oracle?
  • Acceso denegado al crear keystore para la aplicación de Android
  • Alternativa a git-repo (auxp repo)
  • El botón "Añadir a la pantalla de inicio" de Android no muestra el sitio web como una aplicación web
  • ¿Cuál es el propósito de la clase Applicaton en android
  •  public void onActivityResult(int requestCode, int resultCode, Intent data) { if(!m_BluetoothAdapter.isEnabled()) { m_BluetoothAdapter.enable(); } switch (requestCode) { case REQUEST_CONNECT_DEVICE: // When DeviceListActivity returns with a device to connect if (resultCode == Activity.RESULT_OK) { // Get the device MAC address String address = data.getExtras() .getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS); // Get the BLuetoothDevice object BluetoothDevice device = m_BluetoothAdapter.getRemoteDevice(address); // Attempt to connect to the device connect(device); } break; case REQUEST_ENABLE_BT: // When the request to enable Bluetooth returns if (resultCode == Activity.RESULT_OK) { // Bluetooth is now enabled, so set up a chat session } else { // User did not enable Bluetooth or an error occured Toast.makeText(this, "Bluetooth not enabled", Toast.LENGTH_SHORT).show(); finish(); } } } 

    Esta es mi función de conexión:

     private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); private void connect(BluetoothDevice device) { m_Device = device; BluetoothSocket tmp = null; // Get a BluetoothSocket for a connection with the // given BluetoothDevice try { tmp = device.createRfcommSocketToServiceRecord(MY_UUID); } catch (IOException e) { } m_Socket = tmp; m_BluetoothAdapter.cancelDiscovery(); try { // This is a blocking call and will only return on a // successful connection or an exception m_Socket.connect(); } catch (IOException e) { try { m_Socket.close(); } catch (IOException e2) { } return; } } 

    Con suerte, lo que estoy haciendo mal es simple, pero me temo que nunca es tan fácil. Esta es la primera vez que hago cualquier desarrollo de Bluetooth, y tal vez estoy haciendo algo descaradamente equivocado … Pero no estoy seguro de por qué obtener el servicio de descubrimiento falló la excepción.

    Puede emparejar / encontrar el dispositivo en todo momento manualmente en el teléfono … Requiere un código de acceso, pero no creo que sea el problema que estoy teniendo.

  • Android setFocusArea y enfoque automático
  • Android / Eclipse PANIC: No se pudo abrir
  • ¿Cuándo debo realizar ciertas operaciones SQLite en otro subproceso (no en el subproceso principal)?
  • Cómo obtener la última fecha de modificación de un archivo
  • Android: camera onPause / onResume issue
  • Cómo dibujar polilla discontinua con android google map sdk v2?
  • 4 Solutions collect form web for “El descubrimiento de servicio falló la excepción utilizando Bluetooth en Android”

    Después de tres días me dieron cuenta gracias a algunos puestos muy útiles.

    Tuve que reemplazar:

     tmp = device.createRfcommSocketToServiceRecord(MY_UUID); 

    con:

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

    Y voilà funciona!

    A partir de la API 15 puede utilizar el siguiente método:

    Intenta reemplazar tu UUID con el valor devuelto del método getUuids () de BluetoothDevice clase BluetoothDevice . Lo que funcionó para mí fue algo como esto:

     UUID uuid = bluetoothDevice.getUuids()[0].getUuid(); BluetoothSocket socket = bluetoothDevice.createRfcommSocketToServiceRecord(uuid); 

    La razón por la que esto funciona es que los diferentes dispositivos admiten diferentes UUIDs y al obtener los UUID del dispositivo usando getUuids , está soportando todas las características y dispositivos.

    Otro método nuevo interesante (apoyado desde la API 14) es este: BluetoothHealth.getConnectionState . No lo he probado pero parece prometedor …

    Se trataba de una edición sugerida de un usuario anónimo que intentaba responder a la respuesta aceptada.

    Una gran diferencia entre su código anterior y posterior es el UUID que está pasando. He encontrado mi respuesta aquí: http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#createRfcommSocketToServiceRecord(java.util DID)

    Tuve que reemplazar:

     tmp = device.createRfcommSocketToServiceRecord(MY_UUID); 

    con:

     private static final UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); tmp = device.createRfcommSocketToServiceRecord(SPP_UUID); 

    Y voila funciona! El código original es para una aplicación peer to peer android. No tiene sentido usar el UUID de la aplicación cuando se conecta a un dispositivo bluetooth serie simple. Es por eso que el descubrimiento fracasa.

    Por lo que como se mencionó anteriormente, el punto es que usted necesita para utilizar el UUID que el servidor está esperando.

    Si se está conectando a un dispositivo bluetooth, como un auricular o un ratón, debe comprobar qué UUIDs está escuchando el dispositivo. Puede ver los UUID como este.

     UUID[] uuids = bluetoothDevice.getUuids(); 

    Y si quieres saber qué significan estos UUIDs, mira esto .

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.