2011-07-25 19 views
11

¡Hola a todos!Solicitud de sincronización Bluetooth en la barra de notificaciones?

Comenzó a programar con Bluetooth en Android hace un rato. Pero ahora me he encontrado con algunos problemas. Me pregunto por qué la solicitud de emparejamiento a veces aparece en la barra de notificaciones y, a veces, esto se omite y el cuadro de diálogo se muestra directamente.

Por ejemplo: Me iniciado mi solicitud de vinculación de un dispositivo embebido y luego hay una notificación como este:

In english: Pairing request for Bluetooth

Y a veces no tengo que preocuparse de la notificación, mi diálogo simplemente aparece como quería que fuera.

Pairing dialog shows up and there was no notification on the status bar

¿Hay manera de coger la notificación y mostrar el cuadro de diálogo o se trata de un error en mi código cuando iniciar el emparejamiento Bluetooth?

EDIT:

ACTUALIZACIÓN 1:

marchamos la respuesta Reno me dio y que en realidad depende de una variedad de cosas. Hay otros medios para mostrar el diálogo directamente. Se llama al siguiente método cuando llega la solicitud de emparejamiento. Se realiza una comprobación para ver si el diálogo debe aparecer en primer plano (true) o como una notificación (falso):

public boolean shouldShowDialogInForeground(String deviceAddress) { 
    // If Bluetooth Settings is visible 
    if (mForegroundActivity != null) return true; 

    long currentTimeMillis = System.currentTimeMillis(); 
    SharedPreferences sharedPreferences = getSharedPreferences(); 

    // If the device was in discoverABLE mode recently 
    long lastDiscoverableEndTime = sharedPreferences.getLong(
      BluetoothDiscoverableEnabler.SHARED_PREFERENCES_KEY_DISCOVERABLE_END_TIMESTAMP, 0); 
    if ((lastDiscoverableEndTime + GRACE_PERIOD_TO_SHOW_DIALOGS_IN_FOREGROUND) 
      > currentTimeMillis) { 
     return true; 
    } 

    // If the device was discoverING recently 
    if (mAdapter != null && mAdapter.isDiscovering()) { 
     return true; 
    } else if ((sharedPreferences.getLong(SHARED_PREFERENCES_KEY_DISCOVERING_TIMESTAMP, 0) + 
      GRACE_PERIOD_TO_SHOW_DIALOGS_IN_FOREGROUND) > currentTimeMillis) { 
     return true; 
    } 

    // If the device was picked in the device picker recently 
    if (deviceAddress != null) { 
     String lastSelectedDevice = sharedPreferences.getString(
       SHARED_PREFERENCES_KEY_LAST_SELECTED_DEVICE, null); 

     if (deviceAddress.equals(lastSelectedDevice)) { 
      long lastDeviceSelectedTime = sharedPreferences.getLong(
        SHARED_PREFERENCES_KEY_LAST_SELECTED_DEVICE_TIME, 0); 
      if ((lastDeviceSelectedTime + GRACE_PERIOD_TO_SHOW_DIALOGS_IN_FOREGROUND) 
        > currentTimeMillis) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

Este es un fragmento del código fuente y como se puede ver que hay maneras de hacer el espectáculo de diálogo:

  1. Si el dispositivo estaba en modo de detección recientemente
  2. Si el dispositivo estaba descubriendo recientemente
  3. Si el dispositivo fue recogido en el selector de dispositivo recientemente
  4. Si la configuración de Bluetooth es visible

Respuesta

8

Según a comment I saw in the android source code

BluetoothPairingRequest es un receptor para cualquier emparejamiento Bluetooth solicitud. Comprueba si la configuración de Bluetooth está actualmente visible y muestra el PIN, la clave de acceso o un cuadro de diálogo de entrada de confirmación. De lo contrario, pone una notificación en la barra de estado, que puede ser haciendo clic para que aparezca el cuadro de diálogo de entrada de emparejamiento.

Así que sí, dependiendo de la visibilidad de BT, se mostrará el diálogo/notificación.

ninja edit: 

Esto puede variar según el hardware utilizado.

  • Si el dispositivo estaba en modo de detección recientemente
  • Si el dispositivo estaba descubriendo recientemente
  • Si el dispositivo fue recogido en el selector de dispositivo recientemente
+0

Wow gracias Reno. Esto realmente debería ser explicado en el desarrollador. docs! Así que debería ponerlo al frente, supongo o hacerlo algo visible, lo probaré, pero si conoce la respuesta, puede compartirlo :) – Mazze

+0

Estoy hablando de la visibilidad de BT, debe enviar un ACTION_REQUEST_DISCOVERABLE intento para solicitar que el dispositivo sea visible para que otros dispositivos puedan encontrarlo. – Reno

+0

De hecho, hago eso, pero ejecuto 'cancelDiscovery()' cuando se descubre el dispositivo. En este [enlace] (http://developer.android.com/guide/topics/wireless/bluetooth.html#ConnectingDevices) En "Descubrir dispositivos" puede ver que uno debe ejecutar 'cancelDiscovery()' una vez que se descubre el dispositivo ... ¿derecho? – Mazze

Cuestiones relacionadas