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.

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 } }; 

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; } 
  • Obtención del valor del sensor de luz
  • ¿Cómo obtener el azimut de un teléfono con lecturas de brújula y lecturas de giroscopio?
  • Implementación de JKalman en Android
  • Sensor de temperatura en Android
  • La brújula android parece poco fiable
  • Obtener la temperatura de la batería en Android
  • Android - Aceleración hacia abajo (smash)
  • Identificar si el sensor funciona cuando la pantalla está desactivada en android
  • Cómo obtener la dirección de la brújula desde el azimut en Android
  • ¿Cómo conseguir que la orientación del teléfono Android coincida con la orientación humana?
  • Uso del sensor de orientación para apuntar hacia una ubicación específica
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.