2011-02-02 1264 views
7

He encontrado un problema extraño. De Actividad onStart() Solicito la activación del Bluetooth y 120s de descubrimiento a través de la intención:Activación de Bluetooth Multiplicación de diálogo de alerta después de la rotación de pantalla

Intent activateBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
startActivityForResult(activateBTIntent, BT_ACTIVATE_INTENT);         

lo uso, no importa si el Bluetooth ya está activado o no. La documentación de Android dice que Bluetooth se activará si no fuera así, y eso funciona bien. En ambos casos consigo sistema de diálogo Alerta

enter image description here

Cuando puedo rotar la pantalla que observo parpadeo. Presione Sí/No para eliminar un cuadro de diálogo, pero aún hay otro a continuación. Realizando la rotación de la pantalla Puedo obtener una pila de cuadros de diálogo de Alerta, y tengo que presionar Sí/No en cada uno para deshacerme de ellos.

El problema descrito está presente solo si Bluetooth no se inició cuando se envió el intento, de lo contrario, funciona correctamente. Probé en diferentes teléfonos 2.2 y el problema está presente en todos. Me parece un problema del sistema Android.

¿Alguien lo ha encontrado también, y tal vez tenga alguna pista útil de cómo evitar esto?

Gracias y saludos.

Respuesta

2

Esto es un error en la aplicación de configuración que causa esto. RequestPermissionActivity está duplicando su instancia de RequestPermissionHelperActivity en rotaciones.

+0

Muchas gracias. He estado buscando esto durante mucho tiempo. Aclamaciones. – Zelimir

0

(Su poste no lo tienen casi la información suficiente, así que estoy asumiendo aquí ...)

No estoy muy seguro acerca de la startActivityForResult.

No debe hacer showDialog() en onCreate() si usa un AlertDialog administrado. Si Bluetooth lo hace, ¿podría intentar no ejecutar el código anterior desde onCreate()?

+0

Actualicé mi publicación para ser más preciso. Gracias por su sugerencia. La intención se envía desde onStart() por lo que esta no fue la causa. – Zelimir

1

Tenía el mismo problema. Después de pasar mucho tiempo con él, he encontrado una solución.

Puede evitar la duplicación de la 'activación Bluetooth Alerta de diálogo' mediante el uso de FLAG_ACTIVITY_NO_HISTORY bandera para activateBTIntent. Pero establecer esta bandera hará que startActivityForResult inutilizable.

El código -

Intent activateBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
activateBTIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
startActivity(activateBTIntent); 

Usando FLAG_ACTIVITY_NO_HISTORY con activateBTIntent eliminará la actividad 'de diálogo Alerta de activación Bluetooth' de la pila de la historia. Así, en este caso, cuando se cambie la orientación, se terminará la actividad 'de activación Bluetooth diálogo Alerta' y pilastra creado (no duplicada):

Referencia http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NO_HISTORY

+1

El problema es que generalmente necesita utilizar startActivityForResult(). De esta forma, se le informa si el usuario presionó Sí o No en el sistema de alerta de activación Bluetooth presentado. ¿Qué haces si el usuario selecciona No? Una cosa que puedes probar. Limite su actividad que inicia la intención de Bluetooth a solo retrato (en su Manifiesto). Tal vez evitarás el problema. Si necesita manejar ambas orientaciones y presentar un diseño diferente en vertical/horizontal, entonces mi sugerencia no sirve. – Zelimir

+0

@Zelimir Tienes razón, pero está funcionando. Cuando el usuario hace clic en Sí, el bluetooth se activa y cuando el usuario hace clic en No, el bluetooth bluetooth permanece desactivado. El problema solo surge cuando está usando onActivityResult para realizar alguna operación. – Vivek

+0

Sí, ese fue exactamente el problema que enfrenté. Mis acciones adicionales dependieron de la selección Sí/No del usuario. Pero, si eso no es importante para ti, acepto que tienes la solución. – Zelimir

0

El problema se ha informado (goggle issue tracker) pero ya está abierto después de 6 años (verificado con Android 7.1.2).

Desafortunadamente la bandera FLAG_ACTIVITY_NO_HISTORY ya no funciona.La única solución alternativa rápida he encontrado hasta el equipo de Android solucionar este problema (si es que alguna vez lo hará) es para bloquear el cambio de orientación de pantalla de actividad, sólo por el tiempo que se muestra el cuadro de diálogo:

activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED); 

para ser llamado justo antes de

Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 

y luego utilice

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_ENABLE_BT) { 
    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
    } 
    super.onActivityResult(requestCode, resultCode, data); 
} 

en consecuencia intención. Es un remedio temporal, pero generalmente es mejor que mostrar este posible problema durante la activación de BT.

Cuestiones relacionadas