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


Android: Bluetooth no consiguió el número de puerto

Tengo problemas con Bluetooth en mi aplicación. Parece que después de 28 BluetoothSocket / BluetoothServerSockets se han creado, todos los puertos se toman. Las tomas no necesitan ser abiertas simultáneamente, son sólo 28 tomas puesto que Bluetooth estaba habilitado.

Esto se puede reproducir utilizando el ejemplo de BluetoothChat proporcionado en las muestras de Android . Simplemente abra y cierre la aplicación 15 veces (la aplicación crea 2 sockets cada vez). En la 15ª vez, se bloqueará y continuará fallando hasta que deshabilite y vuelva a habilitar Bluetooth:

  • Retrofit: parámetros de consulta múltiples en el comando @GET?
  • ¿Cómo puedo realizar un elemento de inspección en Chrome en mi dispositivo Android Galaxy S3?
  • Detectar cuando el roaming está desactivado en Android
  • Anuncios admob no se muestran con pro guard
  • Fecha y hora de la fecha
  • ¿Cómo obtener la intensidad actual de la señal de la celda?
  •  12-06 18:43:58.177: E/BluetoothSocket(18530): bindListen, fail to get port number, exception: java.io.IOException: read failed, socket might closed, read ret: -1 12-06 18:43:58.193: E/BluetoothChatService(18530): Socket Type: Insecurelisten() failed 12-06 18:43:58.193: E/BluetoothChatService(18530): java.io.IOException: Error: -1 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.bluetooth.BluetoothAdapter.createNewRfcommSocketAndRecord(BluetoothAdapter.java:1035) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.bluetooth.BluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord(BluetoothAdapter.java:982) 12-06 18:43:58.193: E/BluetoothChatService(18530): at com.example.android.BluetoothChat.BluetoothChatService$AcceptThread.<init>(BluetoothChatService.java:280) 12-06 18:43:58.193: E/BluetoothChatService(18530): at com.example.android.BluetoothChat.BluetoothChatService.start(BluetoothChatService.java:119) 12-06 18:43:58.193: E/BluetoothChatService(18530): at com.example.android.BluetoothChat.BluetoothChat.onResume(BluetoothChat.java:131) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1185) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.Activity.performResume(Activity.java:5182) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2732) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2771) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2235) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.ActivityThread.access$600(ActivityThread.java:141) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.os.Handler.dispatchMessage(Handler.java:99) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.os.Looper.loop(Looper.java:137) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.ActivityThread.main(ActivityThread.java:5039) 12-06 18:43:58.193: E/BluetoothChatService(18530): at java.lang.reflect.Method.invokeNative(Native Method) 12-06 18:43:58.193: E/BluetoothChatService(18530): at java.lang.reflect.Method.invoke(Method.java:511) 12-06 18:43:58.193: E/BluetoothChatService(18530): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 12-06 18:43:58.193: E/BluetoothChatService(18530): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 12-06 18:43:58.193: E/BluetoothChatService(18530): at dalvik.system.NativeStart.main(Native Method) 

    ¿Hay alguna forma de liberar los puertos después de cerrar el socket?

  • ¿Cómo averiguar qué vista está enfocada?
  • Diferencia entre el hilo principal y el hilo de interfaz de usuario
  • Dispositivos Android: asura, águila y ka
  • ¿Por qué usar strings.xml en Android?
  • Aplicar estilo diferente al botón cuando se presiona
  • Android: ¿cambia dinámicamente el icono de ActionBar?
  • 3 Solutions collect form web for “Android: Bluetooth no consiguió el número de puerto”

    Puedo verificar este comportamiento en el dispositivo que tengo aquí; Aunque el número de veces que se requiere para bloquear de la misma manera varía según el dispositivo (creo que 20-25 veces se requerían en el Galaxy Nexus ejecutando 4.2) por lo que el número disponible de puertos maneja parece variar. También puedo contribuir con la información de que el problema no es una pérdida de memoria en la aplicación de ejemplo (o en tu aplicación) ya que todas las instancias de BluetoothSocket han sido liberadas y cerradas por Dalvik. Los pasos enumerados aquí sólo prueban el problema en BluetoothServerSocket , por lo que no está claro si el problema está específicamente relacionado con eso, aunque parece poco probable.

    Al menos en mis dispositivos, ni siquiera puede iniciar la aplicación de nuevo hasta cambiar el estado del adaptador Bluetooth, por lo que el problema está definitivamente en la gestión subyacente de las conexiones en la pila.

    Me gustaría presentar un error con los pasos para reproducir aquí http://b.android.com y yo estaría feliz de upvote.

    Recientemente, tuve que ahondar en llegar con una solución para esto. Actualizar Android no era una opción.

    Resulta que si, en vez de destruir y recrear mAcceptThread cada vez que se establece una conexión / se rompe, mantenga la instancia original y vuelva a usarla. Esto minimiza el efecto del error en tu aplicación.

    Desde el archivo BluetoothChatService, en la función connected (), no cancele mAcceptThread:

     public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) { ... ... ... // Cancel the accept thread because we only want to connect to one device //(Rather stay listening so comment out the cancel line!!) //If necessary, use some other state to prevent a second connection. //DONT CANCEL: if (mAcceptThread != null) {mAcceptThread.cancel(); mAcceptThread = null;} ... ... 

    En la clase AcceptThread, modifique el bucle en la función run ():

      // Listen to the server socket if we're not connected //OLD LOOP: while (mState != STATE_CONNECTED) //(Rather use STATE_NONE so the loop will only stop when the service does) while (mState != STATE_NONE) 

    Puede haber otras cosas que hacer en su código para implementar correctamente la idea.

    Para volver a conectar i utilizar en un controlador de tiempo en el fragmento:

     BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(MainActivity.mac); // Attempt to connect to the device mChatService.connect(device, true); 

    Para resolver el problema "falla al volver a conectar por más de 28 veces" comenté cada vez que el servicio se reinicia cuando pierde la conexión:

     //BluetoothChatService.this.start(); 

    También comenté todas las partes donde se cierra el socket:

     //socket.close(); //mmServerSocket.close(); //mmSocket.close(); //mSecureAcceptThread.cancel(); 

    Y agregó una detección no nula para el subproceso de aceptación y conectado thead para no fallar:

     if(mAdapter != null) { tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE, MY_UUID_SECURE); }else{ mAdapter = BluetoothAdapter.getDefaultAdapter(); //mState = STATE_NONE; } 

    y

     if(mmServerSocket != null) { socket = mmServerSocket.accept(); } 

    Todavía consigo gotas aleatorias de la conexión, pero el servicio re conecta y todo trabaja.

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