即使使用WakeLock,加速度计在Droid / Nexus One屏幕closures时也会停止提供样品

我有一些扩展服务的代码,并在Android上loggingonSensorChanged(SensorEvent事件)加速度传感器读数。 即使在设备closures的情况下,我也希望能够logging这些传感器读数(我对电池使用寿命非常小心,而且在运行时显而易见)。 而在2.0.1摩托罗拉Droid和2.1 Nexus One的日志logging工作正常。

但是,当手机进入睡眠状态(通过按下电源button),屏幕closures, onSensorChanged事件停止发送(通过使用LogE消息每N次onSensorChanged被调用来validation)。

该服务获取wakeLock以确保它在后台保持运行; 但是,似乎没有任何效果。 我已经尝试了所有的PowerManager。 唤醒锁,但没有一个似乎很重要。

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

关于在屏幕closures的时候是否真的能够从传感器获取数据,有相互矛盾的报道…任何人都可以在更现代的Android(Eclair)版本和硬件上有这方面的经验吗?

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

PS:完全相同的代码在G1上按照1.5的预期工作。 当屏幕closures,应用程序在后台等时,logging继续。

Solutions Collecting From Web of "即使使用WakeLock,加速度计在Droid / Nexus One屏幕closures时也会停止提供样品"

我们从2.0.1开始推断这个。 这似乎是故意的,也许是电池寿命提升的一部分,被吹捧为一个function。 我们有一个动摇,以2.0唤醒或解锁,然后打破了更新,我们还没有能够得到任何forms的解决方法。 ;'(不要紧,如果CPU部分locking被认为总是阻止CPUhibernate,从我所见过的在USB上loggingdebugging,偶尔会有提及传感器侦听器的变化,因为睡眠发生。

一位用户发布了一个解决scheme,宣称他在摩托罗拉设备上工作 – https://sites.google.com/a/bug-br.org.br/android/technical-documents

我testing了这个解决方法,从教程和一些手册修订(在他的教程提供的代码中有一些“错误”):

 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时却不起作用,这是我的许多用户真正希望与我正在开发的内容一起工作的function。

刚刚用FROYO FRF50 ROM更新了我的Nexus One,FROY50在过去的几天里一直在互联网上运行,看起来如果你有一个PARTIAL_WAKELOCK,屏幕closures的时候传感器会再次工作。 我不知道这是否会让它成为官方版本,虽然我的理解是这是基于一些N1用户收到的官方版本。 所以也许他们已经改变了主意(再一次),并在手机被locking时重新启用传感器。 手指交叉。

当然,他们可以在2.2-R1再次禁用它们,谁知道…

在HTC EVO上使用SCREEN_DIM_WAKE_LOCK工作。

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

它似乎是2.1固件问题,这是我必须得到这个固定的,但我必须在各种解决方法,以涵盖所有版​​本。

我一直在列出一些工作/不工作/间歇工作的手机和固件,以便我们可以testing手机或固件。

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

如果你有一个新手机,你可以更新列表,让我知道。

有一个替代的解决scheme(有点),你保持屏幕始终打开使用:

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

但是这并不妨碍用户通过按下电源button强制屏幕closures,然后传感器事件stream停止。 您还需要WRITE_SETTINGS权限才能正常工作。

上面的重新注册传感器事件的解决方法不适用于运行Android 2.1的Droid Eris,预计不会升级。 我已经使用了下列,但似乎工作。 这种方法不是取消注册和重新注册,而是在用户closures屏幕时重新开启屏幕,虽然它变暗了。 在下面的代码中,handler只是一个在Activity中构造的简单Handler(即Handler handler = new Handler();),mTurnBackOn是一个初始化为null的WakeLock。

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