2013-01-11 25 views
11

この質問は何度も尋ねられましたが、それは満足に答えられていません。Android - StandByモードに入ることなく画面をオフにする

私の問題は以下の通りです:

私は時間の事前に定義された量のためにオフから画面を防止活性を有しています。

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

私は彼が「キャンセル」を押してdoesntの場合、ディスプレイは10秒で消灯しますユーザに知らせるカウントダウンしてダイアログを表示上で所定の時間があります。

私はディスプレイの電源を切ることができましたが、電話機は常にスタンバイモードに切り替わります。オフの場合

私が使用:

Window mywindow = getWindow(); 

WindowManager.LayoutParams lp = mywindow.getAttributes(); 

lp.screenBrightness = 0.0f; 

mywindow.setAttributes(lp); 

は完全に(活動を一時停止)、スタンバイモードに行くことなく、ディスプレイを暗くするために任意の可能性があります。

私の目標は、画面を再び明るくするためにディスプレイをタップするだけでよいということです。したがって、アクティビティはアクティブ状態のままでなければなりません。

同様の質問が尋ねられましたhere

この質問はほぼ一歳なので、私はその間に誰かがこれに対処してくれたかもしれないと考えています。挨拶の

たくさん

Siggy

+0

['PowerManager'](http://developer.android.com/reference/android/os/PowerManager.html)を試しましたか?スクリーンをオン/オフするのに役立ちます。私は恐怖ですが、タッチイベントを受け取るあなたのアクティビティも無効になるかもしれません。 –

+1

可能であるかどうかとは別に、これを実装することをお勧めしますか?画面が消えると、ユーザーは待っていると予想します。バッテリ寿命を低下させる可能性のある他のプロセスが実行されていないことを意味します。しかし、デバイスがロックされており、ロックを解除するためにピンコードなどが記入されている必要があります。 アプリケーションを「一時停止」することを恐れないでください。実際には、Androidのアクティビティライフサイクルを考慮して「停止」されます。一時停止は、例えば、デバイスが待機するときではなく、ダイアログが開いたときです。 –

+0

@Singularity私は現在 'PowerManager'と' WakeLocks'で少し遊んでいますが、私はまだ持っていたいと思っている正確な処理を実現できません。 – Siggy

答えて

7

画面をオフにして、ディスプレイをタッチすることで、単に再活性化することはできませんように思えます。今

私の新しいアプローチ:

private WakeLock screenWakeLock; 

PowerManager pm = PowerManager.getSystemService(Context.POWER_SERVICE); 
screenWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
           "screenWakeLock"); 
screenWakeLock.acquire(); 

PARTIAL_WAKE_LOCKは、CPUが稼働し続けるが、ディスプレイがシャットダウンすることができます。

電源ボタンまたはホームボタンを押すと、ディスプレイが再びオンになり、アクティビティがもう一度表示されます(「スライドからロック解除」またはsth以外)。

screenWakeLockを忘れずにリリースしてください。私は活動のonResume()でそれをやった私の場合は

if (screenWakeLock != null) { 
    if(screenWakeLock.isHeld()) 
     screenWakeLock.release(); 
    screenWakeLock = null; 
} 

多分これが将来的に同様の問題を持つ人を支援します。

+1

+1が、ウェイクロックがで廃止されることに注意してくださいAPI 13(13より小さいminSDKを指定した場合でも上位バージョンで使用できます)。 – ripopenid

+0

APIの新しいバージョンでは、以下のように使用する必要があります: 'PowerManager pm =(PowerManager)getBaseContext()。getSystemService(Context.POWER_SERVICE);' – forresthopkinsa

1

注:私はSCREEN_OFF_TIMEOUTを変更することに回避策を考え出してきたWAKELOCK

で動作することができませんでした。そのためには、 コードを使用してください。

Settings.System.putInt(getContentResolver(), 
          Settings.System.SCREEN_OFF_TIMEOUT, 10); 

これは、screen_timeout SYSTEM-WIDEのタイムアウトとして10ミリ秒を設定します。

これでもたらされるSYSTEM-WIDEの変更により、問題が発生する可能性があります。この問題を回避するには、デフォルトのscreen_timeout_timeを取得して変数に保存し、アクティビティのfinish()でシステムのSCREEN_OFF_TIMEOUTを戻すことができます。私たちのscreen_timeoutように10msを設定する前に

は今、あなたの変更を完了したか、あなたの活動が終了したときにあなたが戻ってSCREEN_OFF_TIMEOUTを設定することができたときにSCREEN_OFF_TIMEOUT、

int defaultScreenTimeout= android.provider.Settings. 
     System.getInt(getContentResolver(),Settings.System.SCREEN_OFF_TIMEOUT,-1); 

を取得します。

@Override 
public void finish(){ 
    Settings.System.putInt(getContentResolver(), 
         Settings.System.SCREEN_OFF_TIMEOUT, defaultScreenTimeout); 
super.finish(); 
} 
関連する問題