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; } 
  • La música en mi juego perturba los valores del acelerómetro. ¿Cómo resolver esto?
  • Sensor de temperatura en Android
  • ¿Cómo conseguir que la orientación del teléfono Android coincida con la orientación humana?
  • Android: ¿Qué hilo llama .onSensorChanged?
  • ¿Es posible tener la distancia movida por un teléfono inteligente utilizando sólo el acelerómetro?
  • ¿Cómo / Debo implementar un filtro de Kalman para obtener datos precisos de Acelerómetro?
  • Sensor Fusion en Android 4
  • ¿Existe una forma estable de detectar el evento de agitación?
  • Android AllJoyn: Conexión con la segunda máquina da error de BusAttachement
  • Perfiles de Acelerómetro Android
  • Extraer valor único del sensor sin utilizar un evento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.