2015-05-14 12 views
19

Ich möchte, dass meine App den Bildschirm einschalten und meine App anzeigen kann. Nehmen wir an, ich setze einen Alarm und jede Stunde möchte ich, dass meine App für 2 Minuten angezeigt wird, bevor das Gerät natürlich schläft.Bildschirm vom Empfänger/Dienst einschalten

Ich sehe, dass WakeLock (FULL_LOCK) und KeyguardManager veraltet sind.

Ich habe einen WakefulBroadcastReceiver und Service erstellt und diese funktionieren.

@Override 
protected void onHandleIntent(Intent intent) { 
    // I need to show the screen here! 

    for (int i=0; i<5; i++) { 
     Log.i("SimpleWakefulReceiver", "Running service " + (i + 1) 
       + "/5 @ " + SystemClock.elapsedRealtime()); 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
     } 
    } 
    Log.i("SimpleWakefulReceiver", "Completed service @ " + 
      SystemClock.elapsedRealtime()); 
    SimpleWakefulReceiver.completeWakefulIntent(intent); 
} 

Wie programmiere ich den Bildschirm programmatisch, komme ich hinter die Sperre und zeige meine Aktivität vom IntentService an?

Dank

+0

'Ich sehe, dass WakeLock und KeyguardManager veraltet sind.' Fügen Sie einen Link bitte –

+0

Die vollständige Sperre benötigen http://developer.android.com/reference/android/os/PowerManager.html#FULL_WAKE_LOCK und http://developer.android.com/reference/android/app/KeyguardManager .KeyguardLock.html – RuAware

Antwort

24

Sie können diesen Code verwenden, um den Bildschirm einzuschalten.

lock = ((KeyguardManager) getSystemService(Activity.KEYGUARD_SERVICE)).newKeyguardLock(KEYGUARD_SERVICE); 
powerManager = ((PowerManager) getSystemService(Context.POWER_SERVICE)); 
wake = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG"); 

lock.disableKeyguard(); 
wake.acquire(); 
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
       | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
       | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
       | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
       | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); 

Sie benötigen die folgende Erlaubnis in AndroidManifest.xml Datei:

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

EDIT (USE THIS ONE, ist deprecated NICHTS):
Es gibt eine eine weitere Alternative, dies zu tun, Dazu müssen Sie eine Aktivität starten. In der Aktivität onCreate() müssen Sie die Flags zum Fenster hinzufügen. Zum Beispiel:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);` 
} 
+0

Danke, aber bitte sehen Sie, dass der PowerManager.FULL_WAKE_LOCK und Keyguard abgeschrieben sind. Ich möchte eine App, die, sobald sie das entfernen, immer noch funktioniert. WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD wird Sie um die Tastensperre herumbringen. aber müssen immer noch das Display aufwachen. – RuAware

+1

Es gibt noch eine Alternative dafür, dass Sie eine Aktivität starten müssen. In der Aktivität onCreate() müssen Sie die Flags zum Fenster hinzufügen., Und FLAG_DISMISS_KEYGUARD ist nicht veraltet. . getWindow() addFlags (WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); – Kartheek

+0

danke, startet eine neue Aktivität mit diesen Einstellungen funktioniert, wenn Sie dies als die Lösung, die ich als richtig markieren. – RuAware

2

Ich weiß nicht, was du redest, ist WakeLock definitiv veraltet nicht. Bestimmte Typen sind nicht mehr die bevorzugte Methode von Google, aber normale Wakelocks sind noch immer verfügbar und immer noch der einfachste Weg, dies zu tun. Stellen Sie sicher, dass das ACQUIRE_CAUSES_WAKEUP-Flag hinzugefügt wird, wenn Sie die Sperre übernehmen. Beachten Sie, dass ein WakefulBroadcastReceiver mithilfe von Wakelocks implementiert wird.

+0

Ich kann den Bildschirm mit PowerManager.FULL_WAKE_LOCK | aufwecken PowerManager.ACQUIRE_CAUSES_WAKEUP Aber PowerManager.FULL_WAKE_LOCK abgeschrieben 17. Zusammen mit KeyguardManager, nur für den richtigen Weg, um es zu tun jetzt – RuAware

1

Sie können diesen Code verwenden, um den Bildschirm einzuschalten.

private void turnScreenOn() { 
    int flags = WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON; 
    getWindow().addFlags(flags); 
} 

Sie können diesen Code verwenden, um ihn zu aktivieren, bis die Wake-Sperre abgeschlossen ist.

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

private PowerManager mPowerManager; 
private PowerManager.WakeLock mWakeLock; 

@Override 
public void onCreate() { 
super.onCreate(); 
    mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "Service"); 
} 

private void acquireWakeLock() { 
    try { 
     mWakeLock.acquire(); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

private void releaseWakeLock() { 
    try { 
     mWakeLock.release(); 
    } 
    catch (Exception e) { 

    } 
} 
+0

Danke, ich fühle mich wie ich bin immer irgendwo und haben etwas ähnliches, aber PowerManager.SCREEN_DIM_WAKE_LOCK hinzugefügt wird abgeschrieben zusammen mit BRIGHT und FULL Sie müssen auch sicherstellen, dass Sie Flags auf UIthread so versucht Empfangen Sie msg -> auf ui hinzufügen hinzufügen keep_screen_on -> partielle Sperre mit Acquire wakes erhalten. Aber das schaltet den Bildschirm nicht ein, das einzige, was denkt, ist die abgeschriebenen Parameter – RuAware

+0

Haben Sie versucht, die turnScreenOn-Funktion?Das habe ich im GCM-Nachrichtenempfänger verwendet, wenn eine bestimmte Art von Nachricht empfangen wurde (prioritätsbasiert) –

+0

Ja, ohne uithread zu setzen bekomme ich "Nur der ursprüngliche Thread, der eine Ansichtshierarchie erstellt hat, kann seine Ansichten berühren." aber schaltet den blöden Bildschirm immer noch nicht ein! Mit einer der entzogenen Optionen scheint es mir jedoch, dass sie planen, etwas wegzunehmen und uns keinen Weg zu geben, es zu tun. – RuAware