2012-03-05 11 views
76

この記事を「重複している」とマークする前に、私はこの記事を書いています。なぜなら、他の投稿がその問題の解決策を保持していないからです。Android:プログラムを使用して画面をオン/オフするにはどうすればよいですか?

デバイスをオフにしようとしていて、数分後またはセンサーを変更した後、再びオンにしてください。

オフ表示テスト

は、私が使用して画面をオフにすることができる午前:私はwl.release()メソッドを使用して画面をオフにすることができませんでした

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

。ディスプレイのテストで

を入れ

私の最初の推測では、次のように、動作しません。何も起こらず、画面はオフのままです。

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); 

これらの方法では、コンソールに何もエラーはありません。パワーボタンを使ってデバイスをオンにすると、私のテストテキスト "Screen on on"が画面に表示されます。これは、コードが実行されたはずであることを示しています。あなたがコードをテストした場合にのみ回答してください。params.screenBrightness = -1のような機能の多くは、sdkに応じて動作しないようです。

+0

画面をオフにするあなたの方法は私のために動作しませんでした。常に画面を保持するようにフラグを設定すると、電力が節約されます。 –

+0

あなたはこれを理解したことがありますか? PlayStoreにいくつかのアプリがあり、彼らがそれを提案している。これを試して、それは動作しますが、それはデバイス管理を要求します。 https://play.google.com/store/apps/details?id=com.katecca.screenofflock&hl=en – George

+0

あなたはこの問題で何かに到達しましたか? –

答えて

5

マニフェストファイルに適切な権限をリクエストしてもよろしいですか?

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

あなたはあなたの活動を開始し、ウェイクロックを取得意図をオフに解雇するAlarmManager 1クラスを使用することができます。これにより、画面がオンになります。ウォークロックを解除すると、デバイスが単独でスリープ状態になります。

また、スリープ状態にデバイスを設定するには、PowerManagerを使用して見てみることができます。http://developer.android.com/reference/android/os/PowerManager.html#goToSleep(long)

+0

お返事ありがとうございます。はい私は確信しています。私のマニフェストには、デバッグエラーはありません。センサーを使って画面をオンにすると、AlarmManagerは私を助けません。私はgoToSleepと大した運がなかったが、それでもまだスクリーンをオンにするのには役に立たない。私は現在、画面をオフにすることができます – thegreyspot

0

私が活動中「画面を目覚め」の希望を持っていないでしょう。画面がオフの場合、アクティビティは一時停止状態になっている可能性があり、コードを実行してはいけません。

起きるときには、ロック画面の問題があります。どのアプリが自動的にロック画面をバイパスできるかはわかりません。

サービスでバックグラウンドタスクを実行し、検出されたときに通知マネージャを使用して通知を送信することを検討する必要があります。通知は、何らかの種類のデバイスアラート(スクリーンウェイクアップ、通知アイコン、通知LEDなど)を提供する必要があります。通知をクリックすると、アクティビティを開始する意図が開始されます。

サービスから直接アクティビティを開始しようとすることもできますが、実際にはアクティビティをオンにするか、ロック画面をバイパスするかはわかりません。

+0

応答をありがとう、私はいくつかの振動コードを入れ、私は画面がオフになって、私は自分のセンサーの1つをアクティブにする、それは振動する。したがって、コードは確実に実行されています。 lockscreenは大したことではない、私はちょうどkeyguardを使用します。 – thegreyspot

+0

コードが実行されても、ライフサイクルの外にあります。画面外の活動は信用できません。 ゲームのダウンローダーを考えると、ほとんどがアクティビティに書かれていて、30秒から数分の間は放置してもダウンロードできますが、OSはあなたの使用パターンに基づいてアクティビティを殺してしまうため、 – 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); 

。テストとして、あなたはその特定の明るさに強制的にそこに強制的に完全な明るさを入れてみてください:

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

これは間違いなく動作します。たとえば、Googleの書籍アプリでは、書籍の使用中に画面の明るさを薄暗く設定してから、それをオフにするときに通常の明るさに戻ることができます。

デバッグを助けるために、 "adb shell dumpsys window"を使ってウィンドウの現在の状態を見ることができます。あなたのウィンドウのデータには、それに設定されている現在の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 +で私にとってうまくいきませんでしたので、私の方法を使わないことをお勧めします。代わりに** [this link](http://stackoverflow.com/a/11708129/840669)**を使用してください。 – Rajkiran

21

は、私はこの1つをお勧めします:

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

は下画面の明るさをサポートするデバイス上で、同じものの実装の成功例であります他の誰かがこれをしようとした場合、それが働いた/動作しませんでしたし、デバイス、AndroidのAPIた場合の値(私はAPI15を実行しているAllwinner中国7" タブレット上でテスト)。

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); 

は、plsは下記のコメント。

+2

私のデバイスでは、これはうまくいきません。画面はまだ少し濃く、完全に黒くはありません。 – 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

こんにちは@Michael、単純にpublic void turnOffScreen()関数を使用してください。 – mangu23

+2

はい、この関数は近接センサーが「近く」の状態のときのみ画面をオフにする 'PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK'を使用しているようです。 – Michael

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

    //later 
    screenLock.release(); 

//ユーザーマニフェストファイル Androidのドキュメントをについて

+2

を使用することができます。これは正しい答えである必要があります。私はAndroid 5を使用していますが、これは実際に動作する唯一のものです。 sidenoteのみがSCREEN_BRIGHT_WAKE_LOCKが推奨されなくなりました。私はドロップインの代替品が表示されません。誰でも? – HammerNL

+0

問題はありません、あなたの答えは完全に使用可能です。私が言ったように: "それは実際に働く唯一の答えです" – HammerNL

0

それが次のコード行を使用することによって達成することができます。

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

これを私のonCreateメソッドで追加しました。正常に動作します。

このリンクには、これと一般的な説明を達成するためのさまざまな方法があります。 documenationへ

リンク:https://developer.android.com/training/scheduling/wakelock.html

1

それを行うための最善の方法(カスタマイズされた端末を使用して):

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){ 
    } 
} 

そして、この:

@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 

    . 
    . 
    . 
} 

今、私たちは、この二つの機能を持っています:

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

私の悪い英語のために申し訳ありません。バックスクリーンのデフォルトモードに

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

+0

こんにちは、ロドリゴ・ゴンティホなぜ私たちはデバイスplをルートする必要があります。教えてください? – Kinjal

+0

@Kinjalあなたは関数( "goToSleep")を呼び出す必要があり、この関数は特別なアクセス許可を必要とするため、システムアプリにのみ与えられます。

+0

ok thanks可能であれば、リンクを提供するか、ルートデバイスの方法を踏んでください。前もって感謝します。 – Kinjal

0

に画面を保つために だけフラグFLAG_KEEP_SCREEN_ONをクリア

getWindow().clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
関連する問題