Es sieht aus wie es unmöglich ist, die Orientierungssensoren lassen auch ständig stundenlang arbeiten, obwohl das Gerät einschlafen kann (siehe http://code.google.com/p/android/issues/detail?id=3708#makechanges
Sobald die Anzeige erlischt, werden die Sensoren gleich tun .. :(.
ich realisiert jetzt eine WakeLock (Bedürfnisse Erlaubnis)
<uses-permission android:name="android.permission.WAKE_LOCK" />
in Verbindung mit einem Timer und einem broadcastreciever, der auf die Anzeige wieder zurück schaltet. das ist natürlich verrückt nach Akkulaufzeit, aber bis jetzt habe ich keinen anderen Weg gefunden.
Das ist meine onCreate Methode im Dienst:
@Override
public void onCreate() {
mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
CONTEXT = this;
PowerManager pm = (PowerManager) CONTEXT.getSystemService(Context.POWER_SERVICE);
this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "my tag");
mWakeLock.acquire();
Log.d(TAG, "Wakelock acquired");
// register receiver that handles screen on and screen off logic
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver mReceiver = new ScreenReceiver();
registerReceiver(mReceiver, filter);
}
dies die onStart Methode des Dienstes:
@Override
public void onStart(Intent intent, int startid) {
Toast.makeText(this, "My Service Started", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onStart");
boolean screenOn = intent.getBooleanExtra("screen_state", false);
if (!screenOn) {
Log.d(TAG, "Screen is on");
} else {
Log.d(TAG, "Screen is off");
Timer timer = new Timer("DigitalClock");
timer.schedule(new TimerTask() {
@Override
public void run() {
Log.d(TAG,"Waiting 1 sec for switching the screen back on again...");
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP,
"my tag");
mWakeLock.acquire();
}
}, 1000);
mWakeLock.acquire();
}
}
und dies ist die BroadcastReceiver Klasse:
public class ScreenReceiver extends BroadcastReceiver {
private boolean screenOff;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
screenOff = true;
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
screenOff = false;
}
Intent i = new Intent(context, MyService.class);
i.putExtra("screen_state", screenOff);
context.startService(i);
}
}
Diese Problemumgehung funktioniert auch, wenn ein Gerät über USB vom Debugger UN-gesteckt ist (ich hatte zuerst ein Problem damit).
Bitte lassen Sie mich wissen, wenn Sie eine bessere Lösung haben, oder wenn in 2.3 behoben ist. Danke!
Ist es immer noch der einzige Weg? Ich meine, gibt es eine bessere Möglichkeit, Android-Sensoren ständig zu überwachen? – Demiurg