Android-Aktivität über Standard-Sperrbildschirm

73

Wie kann ich ein anzeigen Activityoder Dialogüber dem Sperrbildschirm sichtbar sein?

Ich habe bereits versucht, meine Sperraktivität beim Einschalten des Bildschirms anzuzeigen, indem ich verschiedene Fenstertypen in der folgenden Activity.onCreate()Methode festgelegt habe:

TYPE_PRIORITY_PHONE
TYPE_SYSTEM_ALERT
TYPE_KEYGUARD

und andere zusammen mit SYSTEM_ALERT_WINDOWund INTERNAL_SYSTEM_WINDOWBerechtigungen.

Meine Aktivität ist sichtbar, nachdem ich das Gerät entsperrt habe.

AKTUALISIEREN:

Ich habe es tatsächlich bereits geschafft, meine eigene Aktivität anstelle des Standardsperrbildschirms anzuzeigen. Es funktioniert perfekt, es sei denn, Sie verwenden die HOME-Taste.

Plugmind
quelle
1
Was genau versuchst du zu erreichen? Versuchen Sie, Ihren eigenen Sperrbildschirm zu implementieren, oder möchten Sie, dass Ihr Warnfenster über dem Sperrbildschirm angezeigt wird (was auch immer ist) oder ...?
Eugene Mayevski 'Rückruf
1
Eigentlich wünschte ich, ich könnte beides implementieren: einen eigenen Sperrbildschirm und einen Dialog über den vorhandenen Sperrbildschirm.
Plugmind
2
Könnten Sie diesen Code posten?
Peter
2
@plugmind: Ich bin auf das gleiche Problem gestoßen. Können Sie bitte Ihren Code als Referenz freigeben?
Mehul Joisar
2
@plugmind, haben Sie die erforderliche Aufgabe erfüllt ,,, Ich stecke gleichzeitig fest ....
Abdul Wahab

Antworten:

122
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD|
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

Versuchen Sie, diese Flags zu verwenden, um den Sperrbildschirm zu deaktivieren, wenn die Aktivität gestartet wird.

Nach API Level 17 können Sie verwenden

<activity
        android:name=".yourActivityName"
        android:showOnLockScreen="true"
        android:screenOrientation="sensorPortrait" >

showOnLockScreen wie im Beispiel ...

Enes
quelle
2
Dies erfordert nicht einmal Berechtigungen. Überraschend.
Jemand irgendwo
4
Funktioniert in meinem Fall nicht, ist hierfür eine spezielle Erlaubnis erforderlich?
Shirish Herwade
6
Die Sache ist, dass dies zumindest unter 4.4 nicht funktioniert, wenn auf dem Sperrbildschirm ein Passwort festgelegt ist. Weiß jemand, wie man den Sperrbildschirm eingeschaltet lässt, aber trotzdem den Dialog darüber anzeigen kann?
Habeeb Ahmed
2
Weiß jemand, wie man die Home-Taste bei benutzerdefinierten Aktivitäten für den Sperrbildschirm verweigert? Die Home-Schaltfläche schließt einfach die Aktivität und bringt sie zum Startbildschirm.
X-HuMan
@karate Es gibt Screen Pinning - developer.android.com/about/versions/android-5.0.html , aber es scheint nicht sehr einfach zu bedienen zu sein (die App muss über die Berechtigung des Gerätebesitzers verfügen)
sunny-lan
32

Gehen Sie nicht zur Aktivität, da Android aus Sicherheitsgründen keinen Sperrbildschirm hinter Ihrer Aktivität anzeigt. Verwenden Sie daher den Dienst anstelle der Aktivität.

Unten ist mein Code in onStartCommand meines Dienstes.

WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

View mView = mInflater.inflate(R.layout.score, null);

WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
    | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
/* | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON */,
PixelFormat.RGBA_8888);

mWindowManager.addView(mView, mLayoutParams);

Und <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />zum Manifest hinzufügen

Shirish Herwade
quelle
1
Ich könnte dies verwenden, um das Layout oben auf dem Display anzuzeigen. Es werden jedoch keine Ereignisse empfangen, selbst wenn ich Ereignishandler hinzufüge. Wie kann man dieses Problem lösen?
Nagylzs
@nagylzs Es werden keine Ereignisse empfangen, da es ein Kompromiss ist, den Bildschirm Ihrer Apps (bei dem es sich nicht um eine System-App handelt) auf dem Sperrbildschirm anzuzeigen. Es ist ein Sicherheitsproblem. Im Allgemeinen erlaubte Android Ihnen nicht, Ihren Bildschirm auf dem Sperrbildschirm mit Berührungsereignissen anzuzeigen (z. B. können Sie einige Passwörter stehlen, indem Sie einen transparenten Bildschirm auf dem Sperrbildschirm
anzeigen
1
Haben Sie versucht, TYPE_SYSTEM_ERROR zu verwenden, damit Sie Ereignisse empfangen können?
Vivek MVK
Das Layout über Sperrbildschirm wird nicht im Vollbildmodus angezeigt , der nicht den gesamten mobilen Bildschirm abdeckt. Was tun, um den gesamten mobilen Bildschirm
Sabari Karthik
layout.score nicht gefunden bitte helfen.
TAHA SULTAN TEMURI
19

Verwenden Sie dies in der onCreate-Methode

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);  
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
// This line should be before setContentView..      
setContentView(......);

Hoffe das wird funktionieren Danke

Sarwar Hasan
quelle
@Subha, haben Sie eine Lösung gefunden, um die Anzeige beim Klingeln des Telefons zu vermeiden? Alarm klingelt?
Android Guy
0

Sie können Code in jeder Antwort verwenden, von der Sie glauben, dass sie funktioniert. Um zu verhindern, dass die HOME- Schaltfläche funktioniert, ändern Sie sie TYPE_SYSTEM_ALERToder TYPE_SYSTEM_OVERLAY(abhängig von Ihrer aktuellen Verwendung) in TYPE_SYSTEM_ERROR:

params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.MATCH_PARENT,
    WindowManager.LayoutParams.MATCH_PARENT,
    WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
    WindowManager.LayoutParams.FLAG_FULLSCREEN | 
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD,
    PixelFormat.TRANSLUCENT
);
params.gravity = Gravity.TOP;
mOverlay = (RelativeLayout) inflater.inflate(R.layout.main, (ViewGroup) null);
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mWindowManager.addView(mOverlay, params);
EIN
quelle