2012-04-01 81 views
9

我正在開發一個鬧鐘應用程序。從主要活動中,我使用廣播設置鬧鐘。然後在在的onReceive廣播接收機我打電話的活動,正在使用戶關閉或暫停報警......在這些活動中,的onCreate年初,我用這個線把屏幕和解鎖設備:以編程方式在Android中打開屏幕

final Window win = getWindow(); 
    win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
    win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 

這工作完美的三星Galaxy S2的Android 2.3.4,但不適用於HTC 2.3.5的HTC。在HTC它什麼也沒做,當我按下鎖定按鈕屏幕自動解鎖沒有我draging圓。它像flag_dissmiss_keygard正在工作,但flag_turn_screen_on不是。有沒有其他方法或另一種解決方案來做到這一點?

回答

14

我開始非常喜歡你,而窗口標誌並沒有真正的工作。

我終於得到它通過使用兩個Android服務工作:KEYGUARD_SERVICEPOWER_SERVICE

KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); 
final KeyguardManager.KeyguardLock kl = km.newKeyguardLock("MyKeyguardLock"); 
kl.disableKeyguard(); 

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP 
     | PowerManager.ON_AFTER_RELEASE, "MyWakeLock"); 
wakeLock.acquire(); 

不要忘記釋放喚醒鎖,當你用它做。

您需要申請許可DISABLE_KEYGUARDWAKE_LOCK

+0

我想它在Nexus One(2.3.6)和Nexus S(4.1.1),它工作得很好。 – nifo 2012-10-02 22:37:57

+4

開發人員,我求求你了:請不要這樣做!只是想發出一個警告,告誡禁用鍵盤鎖就像它說的那樣:它會繞過任何PIN或模式解鎖。嘗試長按家庭(薑餅)或應用程序切換按鈕(ICS),你會明白我的意思。在最流行的手機上,我沒有使用佈局參數的問題,並且每天都會有薑餅手機的數量在減少。請重新考慮窗口標誌! – 2012-12-11 07:19:08

+2

嘿@PatrickHorn你能指定一個設備的例子,它繞過了PIN鎖定屏幕。在我的測試中,我可以用我想要的信息向用戶顯示一個屏幕,第二個用戶試圖打開家或切換應用程序,他會得到輸入PIN屏幕。所以這對我來說似乎足夠安全。 – marmor 2012-12-11 09:25:52

1

我還從許多問題的困擾我的應用程序。其實我想要屏幕鎖定當用戶按下後退按鈕兩次。並在用戶按下主頁按鈕時解鎖。

解鎖設備marmor的代碼是正確的。 :)我已經使用這個代碼。

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
       WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK 
               | PowerManager.ACQUIRE_CAUSES_WAKEUP 
               | PowerManager.ON_AFTER_RELEASE, "MyWakeLock"); 
       wakeLock.acquire(); 
+1

在我的設備中,這個解決方案只打開屏幕,但不解鎖android。我需要添加事端嗎? – Manza 2015-12-09 23:14:00

+0

@Manza使用marmor給出的下面的代碼。這也會解鎖設備。 – 2015-12-10 06:54:35

2

下面是解

WindowManager windowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      LayoutParams.WRAP_CONTENT, 
      LayoutParams.WRAP_CONTENT, 
      LayoutParams.TYPE_SYSTEM_ALERT | 
        LayoutParams.TYPE_SYSTEM_OVERLAY, 
        LayoutParams.FLAG_NOT_TOUCH_MODAL | 
        LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
        LayoutParams.FLAG_KEEP_SCREEN_ON| 
        LayoutParams.FLAG_DISMISS_KEYGUARD| 
        LayoutParams.FLAG_TURN_SCREEN_ON, 
      PixelFormat.TRANSPARENT); 

KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 
    km.isKeyguardLocked(); 

    windowManager.addView(mTopView, params); 
    getWindow().setBackgroundDrawable(); 
+0

這是否需要任何許可? – 2016-08-10 14:49:31

+0

對不起,我已經在AndroidManifest.xml中給出了許可 koteswarao 2016-08-12 07:22:34

相關問題