gpt4 book ai didi

android - 当 Droid/Nexus One 上的屏幕关闭时,加速度计停止提供样本,即使使用 WakeLock

转载 作者:IT老高 更新时间:2023-10-28 22:18:29 24 4
gpt4 key购买 nike

我有一些代码可以扩展服务并记录 Android 上的 onSensorChanged(SensorEvent event) 加速度计传感器读数。即使设备关闭,我也希望能够记录这些传感器读数(我很注意电池生命周期,并且在运行时很明显)。虽然屏幕显示在日志记录上,但在 2.0.1 摩托罗拉 Droid 和 2.1 Nexus One 上运行良好。

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

服务获取一个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 sleep 。从我看到的通过 USB 记录调试的情况来看,似乎偶尔会提到传感器监听器在 sleep 发生时发生变化。

一位用户发布了一个他声称适用于摩托罗拉设备的解决方法 - 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,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2143102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com