La orientación de la pantalla de Android difiere entre los dispositivos
Descripción
Tengo una actividad que muestra la vista previa de la cámara en una vista de superficie. No quiero que se reinicie en los cambios de orientación (como su constante búsqueda de códigos QR), por lo que la orientación está bloqueada en el retrato.
- ¿Cómo implementar el sensor de giroscopio en android?
- Cómo calcular el movimiento del teléfono en la dirección vertical del resto?
- Calcular el consumo de energía del sensor Android
- Conseguir vector de dirección en Android
- Android Solución para los sensores que no funcionan cuando la pantalla está desactivada
El problema que tengo es que necesito mostrar instrucciones en pantalla al usuario en la parte inferior de la pantalla. Dado que la pantalla está bloqueada en una orientación, no recibo notificación de la nueva orientación, ya que la actividad no se vuelve a dibujar. Así las instrucciones fueron rendidas en el mismo lugar sin importar el teléfono estado en retrato, retrato invertido, paisaje o paisaje venerado.
Para solucionar este problema, me conecté al administrador de sensores para leer en la orientación en tiempo real. (Vea el código abajo) Después de leerlo en el trabajo de la orientación yo mismo y mover mis instrucciones según sea necesario a medida que cada actualización se me envía. Esto ha funcionado para mí hasta ahora hasta hace poco. Al probarlo en un Asus Transformer Prime y tabletas Xoom. La tableta está volviendo la orientación como "90" para el retrato, en lugar de "0" como mis otros 2 teléfonos. Así como usted puede ver en el código abajo, compruebo para las tabletas (pantallas grandes) y menos los 90 grados adicionales.
Problema
El problema es que la nueva tableta Nexus 7 no tiene este sesgo adicional. En el retrato devuelve "0", pero lo detecto como una tableta, así que menos 90 grados así el resultado es 270 y pone mis instrucciones como si la tableta estuviera en modo del paisaje. Supongo que el razonamiento detrás de esto es el Xoom / Transformer fue diseñado para ser utilizado en el paisaje, y el Nexus en el retrato, pero a menos que sepa acerca de todos los dispositivos afectados esto no ayuda.
Pregunta
¿Existe una manera fiable de detectar la orientación a través de todos los dispositivos y devolver los resultados en "tiempo real", como en el código de abajo, pero teniendo en cuenta la orientación predeterminada del dispositivo (es decir, los teléfonos + Nexus 7 son de retrato, pero la mayoría de las tabletas son paisaje)?
Código actual
boolean large = ((getBaseContext().getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE); boolean xlarge = ((getBaseContext().getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 4); isTablet = large || xlarge; myOrientationEventListener = new OrientationEventListener(getBaseContext(), SensorManager.SENSOR_DELAY_NORMAL) { @Override public void onOrientationChanged(int orientation) { if (orientation == -1) { return; } if (isTablet) { orientation += -90; if (orientation < 0) // keep the result between 0-360 { orientation += 360; } } // Work out the orientation if (orientation >= 60 && orientation <= 140) { screenOrientation = ScreenOrientation.Landscape_Reversed; } else if (orientation >= 140 && orientation <= 220) { screenOrientation = ScreenOrientation.Portrait_Reversed; } else if (orientation >= 220 && orientation <= 300) { screenOrientation = ScreenOrientation.Landscape; } else { screenOrientation = ScreenOrientation.Portrait; } //... Do stuff with new orientation here } };
- ¿Cómo puedo obtener el nombre de un sensor?
- Lectura de la temperatura a través de DHT11 usando Android Things
- Sensor de dirección Android
- La brújula android parece poco fiable
- ¿Qué teléfonos Android por ahí tienen un giroscopio?
- Inclinar una imagen en la titulación a cualquier ángulo
- ¿Cómo puede configurar TI SensorTag para recopilar datos para su posterior recuperación?
- Android - Aceleración hacia abajo (smash)
Arreglado
Reemplazó el código
if (isTablet) { orientation += -90; if (orientation < 0) // keep the result between 0-360 { orientation += 360; } }
Con lo siguiente
//Check "normal" screen orientation and adjust accordingly int naturalOrientation = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation(); if (naturalOrientation == Surface.ROTATION_0) { Logging.d(TAG, "Rotation ROTATION_0"); } else if (naturalOrientation == Surface.ROTATION_90) { Logging.d(TAG, "Rotation ROTATION_90"); orientation += 90; } else if (naturalOrientation == Surface.ROTATION_180) { Logging.d(TAG, "Rotation ROTATION_180"); orientation += 180; } else if (naturalOrientation == Surface.ROTATION_270) { Logging.d(TAG, "Rotation ROTATION_270"); orientation += 270; } if (orientation > 360) // Check if we have gone too far forward with rotation adjustment, keep the result between 0-360 { orientation -= 360; }
- Cómo obtener atributos con el espacio de nombres "android" en TextView personalizado
- ¿Cómo puedo escribir una declaración posterior a una HttpUrlConnection que está comprimida?