Aufrufen der versteckten API in Android, um den Bildschirm auszuschalten

Lesezeit: 6 Minuten

Aufrufen der versteckten API in Android um den Bildschirm auszuschalten
David Schellabarger

Ich denke darüber nach, eine versteckte API zu verwenden, um den Bildschirm in meiner App auszuschalten.
setScreenState von https://android.googlesource.com/platform/frameworks/base/+/eclair-release/core/java/android/os/Power.java macht was ich will, aber es ist eine versteckte API. Bedeutet das, dass ich es nicht verwenden sollte? Ich würde denken, dass es eine ziemlich stabile API ist.
Derzeit stelle ich das Bildschirm-Timeout auf 1 Millisekunde ein und setze das Timeout dann zurück, sobald sich der Bildschirm ausschaltet. Android ignoriert jedoch die 1 Millisekunde und stattdessen dauert es etwa 3 Sekunden, um sich auszuschalten, und manchmal ignoriert es sie vollständig und schaltet sich nicht aus.
Irgendwelche Vorschläge?

  • Suchen Sie nach der Verwendung? oder eine andere Möglichkeit, den Bildschirm auszuschalten? Sie können Reflektion verwenden, um die Methode aufzurufen, obwohl sie “versteckt” ist. Sie erhalten jedoch wahrscheinlich eine Ausnahme, die besagt, dass Sie keinen Zugriff auf die Methode haben. Einige APIs können nur von “System”-Prozessen verwendet werden. Und da Ihre Anwendung kein “System”-Prozess ist, können Sie sie nicht verwenden.

    – Ryan Alford

    9. Dez. 09 um 19:28

  • Ich würde lieber eine öffentliche API verwenden, aber ich kann keine finden, und der Hack, den ich gerade verwende, mit dem Bildschirm-Timeout funktioniert manchmal nicht. Ich glaube, ich bin mit Reflexion vertraut, aber ich habe es noch nicht ausprobiert. Ich denke, meine Frage ist: Wenn ich keine Alternative finden kann, wie schlimm ist es, eine relativ stabile versteckte API zu verwenden?

    – David Schellabarger

    9. Dezember 2009 um 22:28 Uhr

  • @i4ndroid Ich bezweifle, dass Google eine API hinzufügen wird, mit der Entwickler den Bildschirm ausschalten können. Aber ich möchte Sie nicht davon abhalten, eine Petition an sie zu richten. Ich würde es gerne sehen. Ich spielte mit dem SCREEN_OFF_TIMEOUT und diese Verzögerung von 5 Sekunden war ein Killer. Ich habe die Funktion zum Ausschalten des Bildschirms inzwischen fallen gelassen. Vielleicht komme ich später darauf zurück.

    – David Schellabarger

    13. Januar 10 um 21:41 Uhr

  • @i4ndroid Anstatt dem Sperrbildschirm App-Verknüpfungen hinzuzufügen, könnte ich vorschlagen, ein FLAG_ONGOING_EVENT-Ordnersymbol in der Benachrichtigungsleiste zu haben, das eine Liste mit App-Verknüpfungen anzeigt. Nur eine Idee. Ich habe darüber nachgedacht, so etwas selbst zu machen, aber ich bin zu sehr damit beschäftigt, an anderen Projekten zu arbeiten. PS Bitte nennen Sie Ihre App nicht Smart Lockscreen, wenn Sie sie veröffentlichen, da meine App Smart Lock heißt. youtube.com/watch?v=Y1JdAlNxLYA

    – David Schellabarger

    13. Januar 10 um 21:44 Uhr

  • Funktioniert diese versteckte API tatsächlich noch auf Android 2.3? Ich konnte Android 2.3.x nicht ausführen, selbst setScreenState wird mit false aufgerufen, und ich sehe es im Protokoll, der Bildschirm wird NICHT ausgeschaltet, Code: pastebin.com/WQKR857z – oder etwas falsch in meinem Code?

    – Mathias Conradt

    2. Juni 12 um 16:14 Uhr

Aufrufen der versteckten API in Android um den Bildschirm auszuschalten
mein Schloss

Folgendes habe ich getan, um die Notwendigkeit zu umgehen, den Bildschirm in den Ruhezustand zu versetzen. Sie können dies in einem Aktivitätsfenster tun. Ich habe es mit der Reduzierung des Sleep-Timeouts auf 5 Sekunden für diese benutzerdefinierte Lockscreen-Aktivität gekoppelt. Sie können alle meine Quellen auf meiner Projektseite anzeigen, aber hier ist der relevante Teil zum Ausschalten des Bildschirms, der für mich auf einem Droiden funktioniert hat.

public void setBright(float value) {
    Window mywindow = getWindow();
    WindowManager.LayoutParams lp = mywindow.getAttributes();
    lp.screenBrightness = value;
    mywindow.setAttributes(lp);
}

//call this task to turn off the screen in a fadeout.


class Task implements Runnable {
    public void run() {                
        if (bright != 0) {
            setBright(bright/100); //start at 10% bright and go to 0 (screen off)
            bright--;
            serviceHandler.postDelayed(myTask, 100L);
        } else {
            setBright((float) 0.0); 
            bright = 10;//put bright back
        }
    }
}

Ich habe die Handler-Aufgabe als Test für die Methode verwendet, sie hat funktioniert, als ich sie im ersten Build von onBackPressed aufgerufen habe. Jetzt habe ich einfach die Aktivität bei onCreate auf 0.0 gesetzt. Dadurch wird der Bildschirm nicht wirklich eingeschaltet, selbst wenn mein Benutzer die CPU durch versehentliches Drücken der Lautstärketaste aufweckt. Wenn ich möchte, dass der Bildschirm eingeschaltet wird, habe ich den Schlüsselereignisaufruf setBright auf einen Wert größer als 0 (1,0 bedeutet maximale Helligkeit). Ich bin sehr glücklich, dass dies für meine benutzerdefinierte Lockscreen-Aktivität funktioniert. Ich habe festgestellt, dass das Ändern der wörtlichen Helligkeitssystemeinstellung so nicht funktioniert und den Bildschirm nicht ausschaltet.

Schauen Sie sich meine andere Quelle in meinem Projekt svn an http://code.google.com/p/mylockforandroid/source/checkout

Wie schwierig ist es Ihrer Meinung nach, das Android-Team zu bitten, Unterstützung für das Ausschalten des Bildschirms hinzuzufügen oder zu definieren, ob der Bildschirm über den Ersatz des Sperrvermittlers aktiviert werden soll, ähnlich wie Sie eine alternative Home Launcher-App programmieren könnten?

  • Ich teste auch, ob man die Verkürzung des Timeouts vielleicht mit Code koppeln kann, der auch die Helligkeit reduziert. Ich habe Helligkeits-Widgets installiert, bei denen der Schieberegler es mir erlaubte, ihn ganz auf 0 zu stellen, und dabei würde sich der Bildschirm tatsächlich ausschalten! Ich melde mich wieder, wenn ich damit weiterkomme.

    – mein Schloss

    12. Januar 10 um 19:39 Uhr

  • Hey David – ich nenne es myLock. Nur ein einfacher Schalter zum Unterdrücken des Sperrbildschirms oder des Sleep-Timeouts. Meine Hauptversion läuft bereits mit einer fortlaufenden Verknüpfung zur Einstellungsoberfläche, aber meine Idee war, einen neuen Sperrbildschirm zu erstellen, der einen Startbildschirm emuliert. Wie auch immer, ich habe heute gelernt, wie ich den Bildschirm trotz CPU-Wake mit einem benutzerdefinierten Sperrbildschirm ausschalten oder ausschalten kann. Es ist ziemlich genial. Ich wünschte nur, wir könnten Zugriff darauf haben, die Regeln für das Aufwecken des Bildschirms zu definieren und ihn im Energiemanager in den Ruhezustand zu versetzen. Ich werde eine Petition an das Android-Team richten. Habe mir dein Smartlock-Video angesehen, sehr schön

    – mein Schloss

    14. Januar 10 um 08:02 Uhr

  • Update: Dies funktioniert sehr gut für meine Bedürfnisse, den Bildschirm ausgeschaltet zu halten, wenn ich ein Schlüsselereignis erhalte, während ein unlock_keyguard-Fenster geöffnet ist, das ich wirklich nicht den Bildschirm einschalten möchte. Es scheint, als könnten Sie eine ähnliche show_when_locked-Aktivität mit derselben Funktionalität aufrufen, wenn Sie einen Bildschirm ausschalten wollten. Meine neueste Quelle zeigt eine Zeitüberschreitung. Wenn der Benutzer während dieses “stillen” Aufwachens die Ein- / Aus-Taste drückt, wird dies behandelt. Ich habe noch nicht getestet, wie Sie das Fenster show_when_locked selbst beenden können, wenn die Übertragung des echten Bildschirms eingeht und signalisiert, dass das Betriebssystem-Timeout beendet ist.

    – mein Schloss

    30. Januar 10 um 18:03 Uhr

  • Wie schaltet man es wieder ein? Wenn ich setBright(1.0) aufrufe; der Bildschirm ist immer noch aus!

    – Der WebMacheter

    22. März 11 um 21:24 Uhr

  • Wie können Sie den Bildschirm dazu bringen, weiterhin auf Berührungsereignisse zu hören, während er “aus” / vollständig gedimmt ist?

    – Mathias Conradt

    2. Juni 12 um 14:17 Uhr

setScreenState … tut, was ich will, aber es ist eine versteckte API. Bedeutet das, dass ich es nicht verwenden sollte?

Ja, es bedeutet, dass Sie es nicht verwenden sollten. In diesem Fall scheint die gesamte Klasse vom SDK ausgeschlossen zu sein. Bitte halten Sie sich an das SDK.

  • Wenn Sie eine Möglichkeit kennen, den Bildschirm zuverlässig auszuschalten, lassen Sie es mich bitte wissen!

    – David Schellabarger

    9. Dez. 09 um 22:29 Uhr

Verwenden Sie eine partielle Wecksperre

http://developer.android.com/reference/android/os/PowerManager.html#PARTIAL_WAKE_LOCK

.

570770cookie-checkAufrufen der versteckten API in Android, um den Bildschirm auszuschalten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy