studio orientacion inventor app acelerometro android accelerometer power-management android-2.0-eclair

android - inventor - sensor de orientacion



El acelerómetro deja de entregar muestras cuando la pantalla está apagada en Droid/Nexus One, incluso con un WakeLock (5)

Tengo un código que extiende un servicio y registra las lecturas del sensor del acelerómetro enSensorChanged (evento SensorEvent) en Android. Me gustaría poder grabar estas lecturas del sensor incluso cuando el dispositivo está apagado (tengo cuidado con la vida de la batería y se hace evidente cuando está funcionando). Mientras que la pantalla está en el registro, funciona bien en un Motorola Droid 2.0.1 y 2.1 Nexus One.

Sin embargo, cuando el teléfono entra en modo de suspensión (presionando el botón de encendido), la pantalla se apaga y los eventos onSensorChanged dejan de entregarse (se verifica mediante un mensaje Log.e cada N veces que se llama a onSensorChanged ).

El servicio adquiere un wakeLock para garantizar que se siga ejecutando en segundo plano; pero, no parece tener ningún efecto. He probado todos los diferentes PowerManager. Bloqueos de vigilia pero ninguno de ellos parece importar.

_WakeLock = _PowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag"); _WakeLock.acquire();

Ha habido informes contradictorios sobre si puede o no obtener datos de los sensores mientras la pantalla está apagada ... ¿Alguien tiene alguna experiencia con esto en una versión más moderna de Android (Eclair) y hardware?

Esto parece indicar que estaba funcionando en Cupcake: http://groups.google.com/group/android-developers/msg/a616773b12c2d9e5

PS: El mismo código funciona exactamente como se indica en 1.5 en un G1. El registro continúa cuando la pantalla se apaga, cuando la aplicación está en segundo plano, etc.


Acabo de actualizar mi Nexus One con la ROM FROYO FRF50 que ha estado dando vueltas en las Internet durante los últimos días, y parece que los sensores ahora funcionan de nuevo cuando la pantalla está apagada si tiene un PARTIAL_WAKELOCK. No sé si esto llegará a la compilación oficial, aunque entiendo que se basa en una compilación oficial que recibieron algunos usuarios de N1. Entonces, tal vez hayan cambiado de opinión (una vez más) y hayan vuelto a habilitar los sensores cuando el teléfono está bloqueado. Dedos cruzados.

Por supuesto, podrían ir y deshabilitarlos nuevamente en 2.2-r1, quién sabe ...


Hay una solución alternativa (tipo de) en la que mantienes la pantalla siempre encendida usando:

Settings.System.putInt (getContentResolver (), Settings.System.SCREEN_OFF_TIMEOUT, -1);

Pero esto no evita que el usuario apague la pantalla presionando el botón de encendido y luego la secuencia de eventos del sensor se detiene. También necesita el permiso WRITE_SETTINGS para que esto funcione.

La solución anterior de volver a registrarse para eventos de sensores no funciona en el Droid Eris, que ejecuta Android 2.1 y no se espera que obtenga una actualización. He usado lo siguiente, aunque parece funcionar. En lugar de cancelar el registro y volver a registrarse, este enfoque vuelve a encender la pantalla cuando el usuario la apaga, aunque vuelve a aparecer atenuada. En el siguiente código, el controlador es solo un controlador simple construido en la Actividad (es decir, el controlador Handler = new Handler ();) y mTurnBackOn es un WakeLock inicializado a nulo.

public BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) { // Turn the screen back on again, from the main thread handler.post(new Runnable() { public void run() { if(mTurnBackOn != null) mTurnBackOn.release(); mTurnBackOn = mPwrMgr.newWakeLock( PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "AccelOn"); mTurnBackOn.acquire(); }}); } } };


Hemos deducido que esto comenzó a partir de 2.0.1. Parece ser intencional, quizás parte del aumento de la vida útil de la batería que se promocionó como una característica. Tuvimos un cambio de funcionamiento para activar o desbloquear en 2.0, luego se interrumpió la actualización y no hemos podido obtener ningún tipo de solución. ; ''(No importa si el bloqueo parcial de la CPU se mantiene, ya que se supone que siempre impide que la CPU se duerma. Por lo que he visto en el registro de depuración a través de USB, parece que ocasionalmente se mencionan los cambios del detector de sensores a medida que ocurre la suspensión.

Un usuario publicó una solución que, según él, funciona en los dispositivos motorola: https://sites.google.com/a/bug-br.org.br/android/technical-documents

Probé la solución alternativa, y obtuve el siguiente código del tutorial y una revisión manual (hay algunos "errores" en su código presentado del tutorial):

public class ShakeWakeupService extends Service implements SensorEventListener{ private Context mContext; SensorManager mSensorEventManager; Sensor mSensor; // BroadcastReceiver for handling ACTION_SCREEN_OFF. public BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // Check action just to be on the safe side. if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { Log.v("shake mediator screen off","trying re-registration"); // Unregisters the listener and registers it again. mSensorEventManager.unregisterListener(ShakeWakeupService.this); mSensorEventManager.registerListener(ShakeWakeupService.this, mSensor, SensorManager.SENSOR_DELAY_NORMAL); } } }; @Override public void onCreate() { super.onCreate(); Log.v("shake service startup","registering for shake"); mContext = getApplicationContext(); // Obtain a reference to system-wide sensor event manager. mSensorEventManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE); // Get the default sensor for accel mSensor = mSensorEventManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); // Register for events. mSensorEventManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL); // Register our receiver for the ACTION_SCREEN_OFF action. This will make our receiver // code be called whenever the phone enters standby mode. IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); registerReceiver(mReceiver, filter); } @Override public void onDestroy() { // Unregister our receiver. unregisterReceiver(mReceiver); // Unregister from SensorManager. mSensorEventManager.unregisterListener(this); } @Override public IBinder onBind(Intent intent) { // We don''t need a IBinder interface. return null; } public void onShake() { //Poke a user activity to cause wake? } public void onAccuracyChanged(Sensor sensor, int accuracy) { //not used right now } //Used to decide if it is a shake public void onSensorChanged(SensorEvent event) { if(event.sensor.getType() != Sensor.TYPE_ACCELEROMETER) return; Log.v("sensor","sensor change is verifying"); } }

La solución funciona para mí, pero no funcionará mientras tengo screebl en ejecución, que es una característica que muchos de mis usuarios realmente quieren trabajar en conjunto con lo que estoy desarrollando.


Parece que es un problema de firmware 2.1, es necesario para mí solucionarlo, pero tengo que trabajar en todo tipo de soluciones para cubrir todas las versiones.

He estado armando una lista de teléfonos y dispositivos que funcionan / no funcionan / funcionan intermitentemente para que podamos probar el teléfono o el firmware.

http://apprssd.com/2010/09/08/android-onsensorchanged-not-working-when-screen-lock-is-on/

Si tiene un teléfono nuevo, puede actualizar la lista con, hágamelo saber.


Usar un SCREEN_DIM_WAKE_LOCK funcionó para mí en el HTC EVO ...

final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); _WakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "TAG"); _WakeLock.acquire();