繁体   English   中英

即使使用WakeLock,当Droid / Nexus One屏幕关闭时,Accelerometer也会停止提供样品

[英]Accelerometer stops delivering samples when the screen is off on Droid/Nexus One even with a WakeLock

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

但是,当手机进入休眠状态时(通过按下电源按钮),屏幕关闭, onSensorChanged事件停止传送(通过每隔N次onSensorChanged调用一次Log.e消息进行验证)。

该服务获取wakeLock以确保它在后台运行; 但是,它似乎没有任何影响。 我已经尝试了各种各样的PowerManager。 唤醒锁,但它们似乎都不重要。

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

关于在屏幕关闭时你是否能真正从传感器获取数据的报道相互矛盾......任何人都对更现代版的Android(Eclair)和硬件有任何经验吗?

这似乎表明它在Cupcake中工作: 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时不起作用,这是我的很多用户真正想要与我正在开发的东西一起工作的功能。

刚刚使用FROYO FRF50 ROM更新了我的Nexus One,过去几天一直在互联网上徘徊,如果你有一个PARTIAL_WAKELOCK,屏幕关闭时传感器现在可以再次运行。 我不知道这是否会成为官方版本,虽然我的理解是这是基于一些N1用户收到的官方版本。 所以也许他们已经改变了主意(再次),并在手机锁定时重新启用了传感器。 手指交叉。

当然,他们可以在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固件问题,我需要修复它,但我必须在各种解决方案中工作以涵盖所有版​​本。

我一直在整理一个工作/不工作/间歇工作的手机和固件列表,以便我们可以测试手机或固件。

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

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

还有一种替代解决方案(某种方式),您可以使用以下方法保持屏幕始终处于打开状态:

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

但这并不能阻止用户按下电源按钮强制关闭屏幕,然后传感器事件流停止。 您还需要WRITE_SETTINGS权限才能生效。

上面重新注册传感器事件的解决方法不适用于运行Android 2.1且预计不会升级的Droid Eris。 我已经使用了以下内容,虽然看起来确实有用。 这种方法不是取消注册和重新注册,而是在用户将其关闭时重新打开屏幕,尽管它会变暗。 在下面的代码中,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();
            }});
        }
    }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM