Flugzeugmodus an/aus je nach Display

  • 4 Antworten
  • Letztes Antwortdatum
H

HammerH

Neues Mitglied
0
Hallo,

ich habe folgendes Problem:
Ich will, dass so lange mein Display an ist, dass Handy NICHT im Flugzeugmodus ist. Sobald das Display ausgeht, soll das Handy in den Flugzeugmodus.

Ich habe diesen Code:

public void onPause()
{
super.onPause();
boolean isEnabled = Settings.System.getInt(
getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, 0) == 1;

// toggle airplane mode
Settings.System.putInt(
getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1);

// Post an intent to reload
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", true);
sendBroadcast(intent);
}


//Flugzeugmodus verlassen, so bald Display wieder an ist.
@Override
public void onResume()
{
super.onResume();

boolean isEnabled = Settings.System.getInt(
getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, 0) == 1;

// toggle airplane mode
Settings.System.putInt(
getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1);

// Post an intent to reload
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", !isEnabled);
sendBroadcast(intent);
}
}

Jedoch macht dieser Code irgendwie nur das, was er will...
Wie stelle ich das ein, dass wirklich nur in den Flugzeugmodus gewechselst wird, wenn das Display des Smartphones aus ist und bei Wiederanschalten des Displays das Smartphone den Offlinemodus verlässt?

Liebe Grüße, HammerH
 
onPause wird NICHT nur aufgerufen, wenn das Display ausgeht, genauso wie onResume nicht nur aufgerufen wird, wenn es angeht. onPause kommt wenn die Activity in den Hintergrund geht und onResume wenn du die Activity wieder aufrufst. Guck dir mal den Activity-Lifecycle auf Android.developers.com an.
Wenn du auf Bildschirm An/aus reagieren willst brauchst du einen Broadcast-Receiver und wohl einen Service in dem dieser läuft. Sonst klappt das auch nur, wenn deine APP aktiv ist.

http://thinkandroid.wordpress.com/2010/01/24/handling-screen-off-and-screen-on-intents/ Hier steht wie es geht.

Gesendet von meinem Galaxy Nexus mit der Android-Hilfe.de App
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: HammerH
Danke dir, dachte mir schon das onResume und onPause das Problem sind.
Ich bin relativ neu in der Android Programmier Szene und komme einfach nicht drauf. Ich habe einfach in meine Activity folgenden Text eingefügt von dem Link, den du gepostet hast:

public static class ScreenReceiver extends BroadcastReceiver {

// THANKS JASON


public static boolean wasScreenOn;

@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
// DO WHATEVER YOU NEED TO DO HERE
wasScreenOn = false;
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
// AND DO WHATEVER YOU NEED TO DO HERE
wasScreenOn = true;
}
}

}
public class ExampleActivity extends Activity {

protected void onCreate() {
// INITIALIZE RECEIVER
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver mReceiver = new ScreenReceiver();
registerReceiver(mReceiver, filter);
// YOUR CODE
}

@Override
protected void onPause() {
// WHEN THE SCREEN IS ABOUT TO TURN OFF
if (ScreenReceiver.wasScreenOn) {
// THIS IS THE CASE WHEN ONPAUSE() IS CALLED BY THE SYSTEM DUE TO A SCREEN STATE CHANGE
boolean isEnabled = Settings.System.getInt(
getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, 0) == 1;

// toggle airplane mode
Settings.System.putInt(
getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1);

// Post an intent to reload
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", true);
sendBroadcast(intent);
System.out.println("SCREEN TURNED OFF");
} else {
// THIS IS WHEN ONPAUSE() IS CALLED WHEN THE SCREEN STATE HAS NOT CHANGED
}
super.onPause();
}

@Override
protected void onResume() {
// ONLY WHEN SCREEN TURNS ON
if (!ScreenReceiver.wasScreenOn) {
// THIS IS WHEN ONRESUME() IS CALLED DUE TO A SCREEN STATE CHANGE
boolean isEnabled = Settings.System.getInt(
getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, 0) == 1;

// toggle airplane mode
Settings.System.putInt(
getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1);

// Post an intent to reload
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", false);
sendBroadcast(intent);
System.out.println("SCREEN TURNED ON");
} else {
// THIS IS WHEN ONRESUME() IS CALLED WHEN THE SCREEN STATE HAS NOT CHANGED
}
super.onResume();
}

}

funktioniert jedoch nicht.
Kannst du mir sagen, was ich da falsch mache?

Eine andere Frage, da ich mehr C-Erfahrung habe, als Java.
Gibt es die Möglichkeit, eine eigene Klasse zu definieren und diese dann aufzurufen?
In C wird ja die Main-Klasse "unendlich lang" durchgelaufen.
Hier ja leider nicht.
Ich würde das Problem gerne mit folgendem PseudoCode lösen:

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
if (powerManager.isScreenOn()){
Flugzeugmodus = off
}

else {
Flugzeugmodus = an
}

Bloß wüsste ich nicht, wo ich den Code platzieren müsste.

LG
 
ScreenReceiver muss auf jeden Fall in ne eigene Datei. Und dann am besten genau erklären was daran nicht funktioniert.

Gesendet von meinem Galaxy Nexus mit der Android-Hilfe.de App
 
  • Danke
Reaktionen: HammerH
Ich finde keine mir verständliche Anleitung für ScreenReceiver, aber ich habe es nun tatsächlich geschafft.
Ich habe einfach einen Boolean ScreenWasOff erstellt und damit mein Problem gelöst.
Danke dennoch :)
 
Zurück
Oben Unten