2012-03-05 140 views
76

在將這篇文章標記爲「重複」之前,我寫這篇文章是因爲沒有其他文章能夠解決這個問題。Android:如何以編程方式打開和關閉屏幕?

我試圖關閉設備,然後幾分鐘後或傳感器發生變化,重新打開它。

關閉顯示測試

我能夠關閉使用屏幕:

params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON; 
params.screenBrightness = 0; 
getWindow().setAttributes(params); 

我一直無法使用wl.release()方法來關閉屏幕。

打開顯示測試

我的第一個猜測,如下所示,不能正常工作。沒有任何反應,屏幕仍然關閉。

params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON; 
params.screenBrightness = -1f; 
getWindow().setAttributes(params); 

我也試着用wakelocks,沒有成功。

PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "tag"); 
wl.acquire(); 

最後,我試了下面,沒有結果。

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 

總而言之,在任何這些方法的控制檯中,我都沒有遇到任何類型的錯誤。當我使用電源按鈕開啓設備時,我的測試文本「屏幕應該亮起」,在屏幕上。這表明代碼應該已經運行。請只回答如果你已經測試了代碼,看起來像params.screenBrightness = -1這樣的許多功能,根據sdk不能正常工作。

+0

你的方法來關閉屏幕,我沒有工作。你設置的標誌始終保持屏幕,這將消耗電力。 –

+0

你有沒有想過這個? PlayStore上有幾個應用程序建議他們這樣做。試過這一個,它的工作原理,但它要求設備管理。 https://play.google.com/store/apps/details?id=com.katecca.screenofflock&hl=en – George

+0

你達到了這個問題什麼?! –

回答

5

您確定您在Manifest文件中請求了正確的權限嗎?

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

可以使用AlarmManager 1類火了啓動你的活動,並獲取之後鎖定的意圖。這將打開屏幕並保持打開狀態。釋放喚醒鎖將允許設備自己進入睡眠狀態。

您也可以看看使用電源管理器來將設備設置爲睡眠:http://developer.android.com/reference/android/os/PowerManager.html#goToSleep(long)

+0

感謝您的回覆。是的,我敢肯定。它在我的清單中,沒有調試錯誤。當我使用傳感器打開屏幕時,AlarmManager不會幫助我。我還沒有與goToSleep運氣很好,但雅仍然沒有幫助我打開屏幕。我目前能夠使屏幕熄滅 – thegreyspot

0

,我不會有「喚醒屏幕」活動中的希望。如果屏幕關閉,則活動可能處於暫停狀態,並且不應運行任何代碼。

醒來時,出現鎖屏問題。我不知道任何應用程序如何自動繞過鎖屏。

您應該考慮在服務中運行後臺任務,然後使用通知管理器在檢測到任何內容時發送通知。通知應提供某種設備警報(屏幕喚醒,通知圖標,通知指示等)。點擊通知時,它可以啓動開始活動的意圖。

你也可以嘗試直接從服務啓動活動,但我真的不知道這是否會打開或繞過鎖屏。

+0

感謝您的迴應,我加入了一些振動代碼,當我關閉屏幕時,我激活了其中一個傳感器,它會振動。所以代碼肯定在運行。鎖屏不是什麼大問題,我只是使用鍵盤鎖。 – thegreyspot

+0

即使代碼運行,它也不在生命週期中。你不能相信在屏幕外的活動。 想想遊戲的下載者,大部分都是寫在這個活動中的,你可以留下30秒到幾分鐘的時間,他們仍然會下載,但是他們通常會因爲操作系統根據你的使用模式殺死活動而中斷。 – HaMMeReD

54

我打算假設你只是希望這在你的應用程序處於前臺時纔有效。

此代碼:

params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON; 
params.screenBrightness = 0; 
getWindow().setAttributes(params); 

不關閉屏幕傳統意義上的。它使屏幕儘可能地變暗。在標準平臺中,它可能會變暗的程度有限;如果您的設備實際上允許屏幕完全關閉,那麼這是該設備實施的一些特點,而不是您可以在各種設備上依靠的行爲。

實際上,將這與FLAG_KEEP_SCREEN_ON結合使用意味着即使特定設備允許您將屏幕亮度設置爲「0」,您也不會允許屏幕熄滅(並因此設備進入低功耗模式)全滅。牢記這一點。如果屏幕真的關閉,你將會使用比你更多的功能。

現在用於轉動屏幕回到正常亮度,只需設置亮度值應該這樣做:

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

我無法解釋爲什麼這會不會取代您以前設置的0值。作爲一個測試,你可以嘗試把一個強制全亮度的存在,迫使該特定亮度:

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

這絕對有效。例如,Google的圖書應用程序使用它可讓您在使用圖書時將屏幕亮度設置爲暗淡,然後在關閉時恢復正常亮度。

爲了幫助調試,您可以使用「adb shell dumpsys窗口」來查看窗口的當前狀態。在窗口的數據中,它會告訴你當前已經爲它設置的LayoutParams。確保你認爲的價值實際在那裏。

而且,FLAG_KEEP_SCREEN_ON是一個單獨的概念;它和亮度對彼此沒有直接的影響。 (如果在將亮度設置爲0時已經設置了亮度,則沒有理由在撤消亮度時再次設置該標誌。該標誌將保持設置狀態,直到您更改爲止。)

+4

有沒有更好的方法來關閉篩選器? – akash

+0

正如@hackbod所述,「params.screenBrightness = 0;」不會完全關閉屏幕;相反,它使屏幕儘可能地變暗。和「params.screenBrightness = -1;」將屏幕恢復到之前的亮度級別。但是,有些情況下我們需要完全關閉屏幕。可能還有其他方法...... – jonathanzh

+3

那些其他方法實際上會關閉屏幕,而不是設置可能或不可行的最小亮度? – Michael

26

我已經寫了這種方法屏幕鎖定後打開屏幕。它對我來說非常合適。試試吧 -

private void unlockScreen() { 
     Window window = this.getWindow(); 
     window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
     window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
     window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
    } 

並從onResume()調用此方法。

+1

如果您計劃在想要終止活動時打開屏幕,則該功能無效。 – AndroidDev

+6

那麼人們,我會建議不要使用我的方法,因爲這對Micromax Canvas2 +不適用。改爲使用** [此鏈接](http://stackoverflow.com/a/11708129/840669)**。 – Rajkiran

21

我建議這一個:

PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag"); 
wl.acquire(); 

標誌ACQUIRE_CAUSES_WAKEUP是這樣解釋的:

正常喚醒鎖定實際上並沒有打開照明。取而代之的是, 它們會導致照明在打開後保持打開狀態(例如,從 用戶活動)。採集WakeLock時,此標誌將立即強制屏幕和/或鍵盤 打開。典型用途 將用於對用戶立即看到 很重要的通知。

此外,還要確保你在AndroidManifewst.xml文件以下權限:

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

不幸的是,SCREEN_BRIGHT_WAKE_LOCK標誌已被棄用。 –

+1

在Nuxus 4和5上不起作用。 – ozmank

+1

太棒了!謝謝你+1 –

3

下面是同樣的事情實現的一個成功範例,其支持低屏幕亮度的設備上值(我上的全志中國7" 平板電腦上運行API15測試)。

WindowManager.LayoutParams params = this.getWindow().getAttributes(); 

/** Turn off: */ 
params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; 
//TODO Store original brightness value 
params.screenBrightness = 0.1f; 
this.getWindow().setAttributes(params); 

/** Turn on: */ 
params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; 
//TODO restoring from original value 
params.screenBrightness = 0.9f; 
this.getWindow().setAttributes(params); 

如果別人嘗試了這一點,請在下面發表評論,如果它的工作/沒有工作和設備,Android的API。

+2

在我的設備上,nexus 7,這不起作用,屏幕仍然亮着,只是一點點黑暗,但不完全是黑色。 – JackWM

+0

當然,這個實現不應該用於公開發布,儘管它可以用於與特定設備的集成。我會保留這篇文章,因爲它可能會幫助其他人。 –

18

您好我希望這將有助於:

private PowerManager mPowerManager; 
private PowerManager.WakeLock mWakeLock; 

public void turnOnScreen(){ 
    // turn on screen 
    Log.v("ProximityActivity", "ON!"); 
    mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag"); 
    mWakeLock.acquire(); 
} 

@TargetApi(21) //Suppress lint error for PROXIMITY_SCREEN_OFF_WAKE_LOCK 
public void turnOffScreen(){ 
    // turn off screen 
    Log.v("ProximityActivity", "OFF!"); 
    mWakeLock = mPowerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "tag"); 
    mWakeLock.acquire(); 
} 
+0

如何在不涉及接近傳感器的情況下關閉屏幕? – Michael

+0

Hi @Michael,你只需使用public void turnOffScreen()函數 – mangu23

+2

是的,但是看起來這個函數使用'PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK',它只在接近傳感器處於「near」狀態時關閉屏幕。 – Michael

4
 WakeLock screenLock = ((PowerManager)getSystemService(POWER_SERVICE)).newWakeLock(
    PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG"); 
    screenLock.acquire(); 

    //later 
    screenLock.release(); 

//用戶清單文件

+2

這應該是正確的答案。我正在使用Android 5,而且這是唯一真正起作用的東西。只有sidenote是SCREEN_BRIGHT_WAKE_LOCK已棄用,我沒有看到替代品。任何人? – HammerNL

+0

沒有問題,您的答案完全可用。正如我所說:「這是唯一的答案,實際工作」 – HammerNL

0

關於到Android文檔,可以使用下面的代碼行實現:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

我在onCreate方法添加這和它工作正常。

上,你會發現不同的方式來實現這一點,一般的解釋,也是鏈接。

鏈接到documenation:https://developer.android.com/training/scheduling/wakelock.html

1

的最好方法(使用root權限的設備)來做到這一點:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    . 
    . 
    . 

    int flags = WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON; 
    getWindow().addFlags(flags); // this is how your app will wake up the screen 
    //you will call this activity later 

    . 
    . 
    . 
} 

現在有這樣兩種功能:

private void turnOffScreen(){ 

    try{ 
    Class c = Class.forName("android.os.PowerManager"); 
    PowerManager mPowerManager = (PowerManager) this.getSystemService(Context.POWER_SERVICE); 
    for(Method m : c.getDeclaredMethods()){ 
     if(m.getName().equals("goToSleep")){ 
      m.setAccessible(true); 
      if(m.getParameterTypes().length == 1){ 
      m.invoke(mPowerManager,SystemClock.uptimeMillis()-2); 
      } 
     } 
    } 
    } catch (Exception e){ 
    } 
} 

而且這樣的:

public void turnOnScreen(){ 
    Intent i = new Intent(this,YOURACTIVITYWITHFLAGS.class); 
    startActivity(i); 
} 

對不起,我英語不好。

+0

你好,羅德里戈貢蒂喬爲什麼我們需要根設備pl。告訴我? – Kinjal

+0

@Kinjal因爲你需要調用函數(「goToSleep」)並且這個函數需要一個特殊的權限,只授予系統應用程序:

+0

ok謝謝並請提供鏈接或步驟如何儘可能根設備。提前致謝。 – Kinjal

0

爲了保持屏幕上:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

回到屏幕默認模式: 只是清除標誌FLAG_KEEP_SCREEN_ON

getWindow().clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
相關問題