2012-03-02 349 views
28

我一直在試圖找到一種方法來關閉顯示屏,並從用戶觸摸觸摸屏時喚醒。
設備處於嵌入式環境中,其中設備是平板電腦,用戶除了觸摸屏外無法訪問任何內容(根本沒有按鈕)。Android - 在不觸發睡眠/鎖定屏幕的情況下關閉顯示屏 - 使用觸摸屏打開

它連接到電源,所以電池不會有問題,但是當我檢測不到任何活動時,我想關閉屏幕,以免它整天盯着它們,並且不會減少生活LCD背光。

我永久保持一個喚醒鎖,並決定何時自己睡覺。

的問題是,當我關掉使用屏幕:

WindowManager.LayoutParams params = getWindow().getAttributes(); 
params.screenBrightness = 0; 
getWindow().setAttributes(params); 

活動被暫停和停止。並且該裝置不響應觸摸來喚醒它。您需要按下電源按鈕。此時「滑動解鎖」出現。

我想關閉顯示屏,然後保持運行,以便我可以檢測觸摸屏事件並重新打開顯示屏。

我也嘗試將顯示器的亮度設置爲0.1,它可以在一些設備上工作,但是我需要它的設備只能「調暗」顯示器。

我也嘗試這樣的:

// First Remove my FULL wakelock 

//then aquire a partial wake lock (which should turn off the display) 
PowerManager.WakeLock wl = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Your Tag"); 

wl.acquire(); 

然而這種方法並不能關閉顯示。

+1

如果我理解正確的,你保持你的活動成功運行和問題的其餘部分是如何關閉屏幕。爲此,我建議在沒有佈局的情況下實施一個頂層輔助活動 - 在這種情況下,Android會顯示黑屏。您可以使用android:theme =「@ android:style/Theme.NoTitleBar.Fullscreen」進行全屏停電。 – Stan 2012-06-08 10:22:18

+3

對於我而言,使用喚醒鎖進行黑屏並不足夠,因爲屏幕背光仍然亮着,所以即使在黑色全屏活動時,在完全黑暗的房間裏仍然太亮 - 我仍然可以看到設備屏幕,但我不應該。 – 2012-06-09 13:12:19

+0

達成了一些關於這個問題?!! – 2016-08-03 09:14:19

回答

1

如果你有服務使用喚醒鎖,但是如果你是從活動側做它的更好的想法使用標誌獲取標誌。

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // For keeping screen on 
     // You can blur screen or dim screen using following flags 
     // FLAG_BLUR_BEHIND - Blur screen 
     // FLAG_DIM_BEHIND - Dim Behind 

您可以清除這些標誌,並將其他標誌強加給模糊屏幕或模糊它。 getWindow()。clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

希望這會解決您的問題。可選擇從 http://developer.android.com/reference/android/view/Window.html

探索其他標誌還有一個據透露.. Calling hidden API in android to turn screen off

+0

如果我刪除了喚醒鎖,並使用此方法來防止設備進入睡眠狀態,但如果沒有設備停止活動,我仍然無法關閉顯示屏。 – NebulaSleuth 2012-03-02 19:22:46

+0

已更新的答案。 – kodeshpa 2012-03-02 19:37:02

+1

好消息:調用隱藏的API函數setScreenState將關閉顯示,而不會暫停或停止我的活動。壞消息是:它似乎也禁用了觸摸屏...... – NebulaSleuth 2012-03-02 22:50:56

0

我不知道是否可以幫助你,但你可以簡單地使用喚醒鎖,以便您scren不斷並顯示ImageView的這顯示黑色圖像

+8

謝謝,但這實際上是我們現有的現狀,不幸的是這並不足夠,因爲屏幕背光仍然亮着,所以即使是黑色全屏活動,它仍然在完全黑暗的房間裏太亮 - 我仍然可以看到設備屏幕,但我不應該。在我的情況下,我需要在賓館房間安裝平板電腦(作爲各種控制面板),當房間完全黑暗時 - 根本不應該有任何光線,甚至沒有變暗的屏幕背光。只有當用戶觸摸設備時,屏幕纔會打開。 – 2012-06-09 13:12:29

+1

我認爲唯一的方法是構建一個自定義ROM並修改內核。這是爲三星Galaxy Tab 1.但仍然需要檢查哪些內核類是相關的。 – 2012-06-09 13:15:39

+0

@MathiasLin你有沒有爲編譯這個自定義ROM而編輯相關的內核文件? – Vins 2013-10-10 10:01:58

0

你可以做的一件事就是收購部分激活鎖定和關閉屏幕使用:

PowerManager.WakeLock wl = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Your Tag"); 
wl.acquire(); 
WindowManager.LayoutParams params = getWindow().getAttributes(); 
params.screenBrightness = 0; 
getWindow().setAttributes(params); 
+0

,將亮度設置爲其最低水平,但不會關閉顯示屏 – 2016-08-01 12:20:24

7

終於想通了。希望能幫助到你。 :)

  • 獲取WindowManager的一個實例。

    WindowManager windowManager = (WindowManager) Class.forName("android.view.WindowManagerImpl").getMethod("getDefault", new Class[0]).invoke(null, new Object[0]);

  • 創建一個全屏幕的佈局XML(設置爲fill_parent佈局參數)

  • 設置你的觀點不點擊,不可作爲焦點,不長點擊等使觸摸通過對傳遞你的應用和應用可以檢測到它。

    view.setFocusable(false);
    view.setClickable(false);
    view.setKeepScreenOn(false);
    view.setLongClickable(false);
    view.setFocusableInTouchMode(false);

  • 創建android.view.WindowManager.LayoutParams類型的佈局的參數。 LayoutParams layoutParams = new LayoutParams();

  • 組佈局參數一樣的高度,寬度等

    layoutParams.height = LayoutParams.FILL_PARENT; 
    layoutParams.width = LayoutParams.FILL_PARENT; 
    layoutParams.flags = 280; // You can try LayoutParams.FLAG_FULLSCREEN too 
    layoutParams.format = PixelFormat.TRANSLUCENT; // You can try different formats 
    layoutParams.windowAnimations = android.R.style.Animation_Toast; // You can use only animations that the system to can access 
    layoutParams.type = LayoutParams.TYPE_SYSTEM_OVERLAY; 
    layoutParams.gravity = Gravity.BOTTOM; 
    layoutParams.x = 0; 
    layoutParams.y = 0; 
    layoutParams.verticalWeight = 1.0F; 
    layoutParams.horizontalWeight = 1.0F; 
    layoutParams.verticalMargin = 0.0F; 
    layoutParams.horizontalMargin = 0.0F; 
    
  • 關鍵的一步:你可以設置你所需要的百分比的亮度。 view.setBackgroundDrawable(getBackgroundDrawable(i));

    private Drawable getBackgroundDrawable(int i) { 
    int j = 255 - (int) Math.round(255D * Math.exp(4D * ((double) i/100D) - 4D)); 
    return new ColorDrawable(Color.argb(j, 0, 0, 0));} 
    
  • 最後補充以您先前創建的窗口管理。

    windowManager.addView(view, layoutParams);

注意:您需要SYSTEM_ALERT_WINDOW許可奠定了屏幕上的覆蓋。

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

已經測試過,它的工作原理。讓我知道如果你卡住了。

+1

雖然這並不實際關閉背光燈,是嗎? 「我想關閉屏幕,因此它不會縮短LCD背光的壽命。」 – Michael 2014-01-29 21:06:29

+0

它適用於所有Android版本嗎? – Vyacheslav 2015-01-06 18:43:03

+0

在JB上工作。之後沒有測試過。 – 2015-02-12 12:14:39

0

@NebulaSleuth

那麼,它已經有一段時間了,有什麼進展?

如果你仍然在這上面:爲什麼不把螺絲起子按鈕和觸摸屏,可能綁定喚醒陀螺儀?

我希望用這樣的事情至少在電話按鈕和卸載喚醒要麼音量控制鍵或陀螺儀...