android – 加速度计停止在Droid/Nexus One上关闭屏幕时提供样品,即使使用WakeLock

我有一些扩展服务的代码,并在Android上记录onSensorChanged(SensorEvent事件)加速度计传感器读数。我想能够记录这些传感器读数,即使设备关闭(我非常小心的电池寿命,它在运行时显而易见)。虽然屏幕上的2.0.1摩托罗拉Droid和2.1 Nexus One的日志记录工作正常。

然而,当手机进入睡眠状态(通过按下电源按钮)屏幕关闭,并且onSensorChanged事件停止传递(通过使用一个Log.e消息每N次onSensorChanged被调用进行验证)。

该服务获取一个wakeLock,以确保它在后台运行;但是,它似乎没有任何效果。我试过所有的各种PowerManager。唤醒锁,但他们似乎都不重要。

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

有关于是否可以在屏幕关闭时实际从传感器获取数据的相关报道有任何人在Android(Eclair)和硬件的更现代版本上有任何经验?

这似乎表明它在蛋糕里工作:
http://groups.google.com/group/android-developers/msg/a616773b12c2d9e5

PS:完全相同的代码按照G1中的1.5进行操作。当屏幕关闭,应用程序在后台等时,日志记录继续。

最佳答案
我们推断出这是从2.0.1开始的。这似乎是故意的,也许是电池寿命提升的一部分被宣称为一个功能。我们有一个工作动作,在2.0上唤醒或解锁,然后它更新了,我们还没有得到任何解决方法。 ;'(如果CPU部分锁定被保留,这应该总是阻止CPU睡眠,这并不重要,从我看过的通过USB记录的调试看起来偶尔会在睡眠发生时提及传感器监听器的变化。

用户发布了他声称在摩托罗拉设备上工作的解决方案 – https://sites.google.com/a/bug-br.org.br/android/technical-documents

我测试了解决方法,提出了教程中的以下代码和一些手动修订(他的教程中提供了一些“错误”代码):

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

解决方法适用于我,但是在我运行screebl时不会工作,这是我的很多用户真正想要与我正在开发的工作相结合的功能。

转载注明原文:android – 加速度计停止在Droid/Nexus One上关闭屏幕时提供样品,即使使用WakeLock - 代码日志