Android deaktiviert das Bildschirm-Timeout, während die App ausgeführt wird

Antworten:

172

Sie möchten so etwas verwenden:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Ian G. Clifton
quelle
4
das macht es für die laufende Aktivität oder die ganze App?
Muhammed Refaat
@ MayurR.Amipara Ja, ich denke, das ist hier der Fall
Muhammed Refaat
1
Wenn ich diesen Code in die Methode onCreate () der Anwendungsklasse schreibe, funktioniert er dann für die gesamte App?
Jayesh
Wenn nein, wie kann ich den gesamten App-Bildschirm eingeschaltet lassen, indem ich weniger Code einfüge, anstatt diese Zeile zu jeder Aktivität hinzuzufügen?
Jayesh
1
@ Jayesh: Sie können eine baseActivity erstellen und diesen Code in die onCreate-Methode schreiben und alle Aktivitäten von baseActivity aus erweitern.
Maryam
102

Ich benutzte:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

um das Bildschirm-Timeout zu deaktivieren und

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

um es wieder zu aktivieren.

capellone78
quelle
83

Es gibt auch eine XML-Methode, die Google empfiehlt:

<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:keepScreenOn="true">

Überprüfen Sie Google Slides - Folie 16.

"Wakelocks sind teuer, wenn sie vergessen werden (...) Erwägen Sie die Verwendung von Android: keepScreenOn, um die Richtigkeit sicherzustellen."

neteinstein
quelle
2
Für diejenigen, die keine Zeit haben, das verknüpfte PDF zu lesen: "Wakelocks sind teuer, wenn sie vergessen werden", "Erwägen Sie die Verwendung von android: keepScreenOn, um die Richtigkeit sicherzustellen".
Lenrok258
2
@ lenrok258 Zur Antwort
hinzugefügt ;-)
Während der Verwendung PowerManager.newWakeLockund getWindow().addFlagsaus irgendeinem Grund nicht funktioniert, tat dies.
Benjamin Basmaci
3

Fügen Sie einfach die folgende Zeile in Ihre hinzu MainActivityund Ihre App schaltet niemals das Licht aus.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Nullzeiger-Ausnahme
quelle
2

In einer Ansicht, in meinem Fall einer SurfaceView-Unterklasse, können Sie den Bildschirm immer einschalten. Ich wollte, dass der Bildschirm eingeschaltet bleibt, während diese Ansicht noch Material zeichnet.

public class MyCoolSurfaceView extends SurfaceView { 
@Override
protected void onAttachedToWindow (){
    super.onAttachedToWindow();
    this.setKeepScreenOn(true);
}

@Override
protected void onDetachedFromWindow(){
    super.onDetachedFromWindow();
    this.setKeepScreenOn(false);
}
Orkoden
quelle
1
Das ist eigentlich komplizierter als nötig. Rufen Sie einfach irgendwo setKeepsScreenOn (true) auf, und das Framework sorgt automatisch dafür, dass der Bildschirm eingeschaltet bleibt, wenn Ihr Fenster angezeigt wird.
Hackbod
1

Setzen Sie dies auf onStart

    PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "no sleep");
    wakeLock.acquire();

Und das manifestiert sich bei dir

    <uses-permission android:name="android.permission.WAKE_LOCK" />

Vergiss es nicht

wakeLock.release();

bei onStop

Gonkas
quelle
1
PARTIAL_WAKE_LOCKErmöglicht das Ausschalten des Bildschirms.
Michael
1

Dies ist der beste Weg, um dies zu lösen

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
MBMJ
quelle
Warum muss FLAG_FULLSCREEN diese Frage beantworten?
Abdul Wasae
0
procedure SetSleep(aEnable:Boolean);
var
    vFlags: integer;
begin
    vFlags := TJWindowManager_LayoutParams.JavaClass.FLAG_TURN_SCREEN_ON or
        TJWindowManager_LayoutParams.JavaClass.FLAG_DISMISS_KEYGUARD or
        TJWindowManager_LayoutParams.JavaClass.FLAG_SHOW_WHEN_LOCKED or
        TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON;

    if aEnable then
    begin
      CallInUIThread (   // uses FMX.Helpers.Android
      procedure
      begin
        TAndroidHelper.Activity.getWindow.setFlags (vFlags, vFlags);
      end );
    end
    else
      CallInUIThread (
      procedure
      begin
        TAndroidHelper.Activity.getWindow.clearFlags (vFlags);
      end );
end;
Artur Majtczak
quelle
0

1.getWindow (). AddFlags (WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) ist die beste Lösung für natives Android.
2. Wenn Sie mit der React Android-Anwendung arbeiten möchten, verwenden Sie bitte den folgenden Code.

@ReactMethod
    public void activate() {
        final Activity activity = getCurrentActivity();
        if (activity != null) {
            activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
                }
            });
        }

    }
Manisha
quelle
-1

Dies kann durch den Erwerb eines Wake Lock erfolgen.

Ich habe es nicht selbst getestet, aber hier ist ein kleines Tutorial dazu.

wonne
quelle
10
Nein nein Nein. Wake-Locks können leicht missbraucht werden und können den Akku des Benutzers entladen, wenn sie nicht sehr vorsichtig verwendet werden. Verwenden Sie View#setKeepScreenOnoder sein XML-Layout-Attribut äquivalent,android:keepScreenOn="true"
adamp
5
@adamp: Das OP hat nicht angegeben, ob es sich bei seiner App um eine Aktivität oder einen Dienst handelt. Eine Aktivität sollte den von Ihnen genannten Mechanismus verwenden. Ein Dienst sollte a verwenden WakeLock.
CommonsWare
Danke, es ist kein Service. Es ähnelt einem Bildbetrachter und ich möchte nicht, dass der Bildschirm abgeblendet wird.
Klemme
@adamp: Ihre Erwähnung android:keepScreenOn="true"ist meiner Meinung nach die einzig gültige Antwort für Aktivitäten. Halten Sie sich von Wakelocks fern, es sei denn, dies ist unbedingt erforderlich.
Pauluss86
Nicht nur Aktivitäten, sondern jede Art von Benutzeroberfläche, die ein Fenster anzeigt. Die akzeptierte Antwort auf die Verwendung des entsprechenden Fensterflags ist gleichermaßen gültig.
Adamp