簡體   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