Android:プログラムで画面のオンとオフを切り替える方法は?


97

この投稿を「重複」としてマークする前に、この投稿を書いています。問題の解決策を保持する投稿は他にないためです。

デバイスの電源をオフにしようとしています。数分後またはセンサーを交換した後、再びオンにします。

ディスプレイテストをオフにする

次の方法で画面をオフにできます。

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

次に、ウェイクロックを使用しようとしましたが、成功しませんでした。

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

最後に私は以下を試しましたが、結果はありませんでした。

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

全体として、これらのメソッドのいずれについても、コンソールでエラーは発生しません。電源ボタンを使ってデバイスの電源を入れると、テストテキスト「画面がオンになります」が画面に表示されます。これは、コードが実行されているはずであることを示しています。コードをテストした場合にのみ回答してください。などの関数の多くはparams.screenBrightness = -1sdkに従って正常に機能しないようです。


1
画面をオフにする方法が機能しませんでした。フラグを設定して、常に画面をオンにしておくと、電力が消耗します。
Kristy Welsh

これを理解したことはありますか?PlayStoreにはいくつかのアプリがあります。これを試してみましたが機能しますが、デバイスの管理を要求します。play.google.com/store/apps/...
ジョージ

この問題で何かに達しましたか?!!
Muhammed Refaat

回答:


69

アプリケーションがフォアグラウンドにあるときにのみこれを有効にしたいと仮定します。

このコード:

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

従来の意味で画面をオフにしません。画面をできるだけ暗くします。標準プラットフォームでは、どれだけ暗くできるかには制限があります。デバイスが画面を完全にオフにすることを実際に許可している場合、それはそのデバイスの実装の特殊性であり、デバイス間で信頼できる動作ではありません。

実際、これをFLAG_KEEP_SCREEN_ONと組み合わせて使用​​すると、特定のデバイスで画面の明るさを完全にオフに設定できている場合でも、画面がオフになる(したがって、デバイスが低電力モードになる)ことは決してありません。これを非常に強く覚えておいてください。画面が本当にオフの場合よりもはるかに多くの電力を使用します。

画面を通常の明るさに戻すには、明るさの値を設定するだけで十分です。

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 window」を使用して、ウィンドウの現在の状態を確認できます。ウィンドウのデータでは、ウィンドウに設定されている現在のLayoutParamsがわかります。実際にあると思う値を確認してください。

また、FLAG_KEEP_SCREEN_ONは別の概念です。それと明るさは互いに直接的な影響はありません。(明るさを0に設定するときに既に設定していた場合は、明るさを元に戻すときに再度フラグを設定する必要はありません。変更するまで、フラグは設定されたままになります。)


8
スクリーンをオフにするより良い方法はありますか?
akash 2013年

@hackbodが前述したように、「params.screenBrightness = 0;」画面を完全にオフにするわけではありません。代わりに、画面をできるだけ暗くします。そして「params.screenBrightness = -1;」画面を以前の輝度レベルに戻します。ただし、画面を完全にオフにする必要がある場合があります。他の方法があるかもしれません...
jonathanzh

6
最小輝度を設定するだけでなく、実際に画面をオフにする他の方法は何ですか?
マイケル

37

画面ロック後に画面をオンにするようにこのメソッドを記述しました。それは私にとって完璧に機能します。それを試してみてください-

    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 2013

7
これはMicromax Canvas2 +では機能しなかったため、私の方法を使用しないことをお勧めします。代わりにこのリンクを使用してください
Rajkiran 2013年

28

これをお勧めします:

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は廃止されました。
CamilleSévigny2014

20

こんにちは私はこれが役立つことを願っています:

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

近接センサーを使わずに画面をオフにする方法は?
マイケル

こんにちは@Michael、あなたは単にpublic void turnOffScreen()関数を使用するだけです
mangu23

3
はい。ただし、この機能はPowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK、近接センサーが「近い」状態のときにのみ画面をオフにする機能を使用しているようです。
マイケル

ああ大丈夫、私はあなたがこの代わりにPowerManager.SCREEN_DIM_WAKE_LOCKを使用することができ、理解
mangu23

1
問題- PROXIMITY_SCREEN_OFF_WAKE_LOCKウェイトロックを解除するとすぐに、画面が再び表示されます。これを防ぐにはどうすればよいですか?
Michael

7
     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を使用していますが、実際に機能するのはこれだけです。副次的注意点は、SCREEN_BRIGHT_WAKE_LOCKが非推奨になっていて、ドロップイン置換が表示されないことです。誰でも?
HammerNL 2016年

問題はありません、あなたの答えは完全に使用可能です。私が言ったように:「それが実際に機能する唯一の答えです」
HammerNL '17 / 10/16

@HammerNLこの回答とramdroidによって提供される回答の違いは何ですか?
バグは

@BugsHappen Ramdroids 1つはより複雑です:)しかし、ええ、それは同じです。Pir Fahim Shahがこの回答を投稿した理由、または私が一度にRamdroidを見なかった理由がわかりません。
HammerNL 2018

6

マニフェストファイルに適切なアクセス許可を要求しましたか?

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

AlarmManager 1クラスを使用して、アクティビティを開始し、ウェイクロックを取得するインテントを起動できます。これにより画面がオンになり、オンのままになります。ウェイクロックを解除すると、デバイスは自動的にスリープ状態になります。

また、PowerManagerを使用してデバイスをスリープ状態に設定する方法についても確認できます。http://developer.android.com/reference/android/os/PowerManager.html#goToSleep(long


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

5

それを行うための最良の方法(ルート化されたデバイスを使用):

@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

   .
   .
   .
}

これで、次の2つの関数ができました。

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

英語が下手でごめんなさい。


こんにちは、Rodrigo Gontijoデバイスplをroot化する必要がある理由。教えてください?
Kinjal 2017

@Kinjalは、関数( "goToSleep")を呼び出す必要があり、この関数には特別な権限が必要です。システムアプリにのみ付与されます:<uses-permission android:name = "android.permission.DEVICE_POWER" />
Rodrigo Gontijo

わかりました。可能であれば、ルートデバイスへのリンクまたはステップを提供してください。前もって感謝します。
Kinjal 2017

4

これは、より低い画面の輝度値をサポートするデバイスでの、同じことの実装の成功例です(API15を実行するAllwinner Chinese 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);

誰か他の人がこれを試してみた場合、それが機能した/機能しなかったか、デバイス、Android APIであるかを以下にコメントしてください。


2
私のデバイスであるネクサス7では、これはうまく機能せず、画面はまだオンですが、少し暗いだけですが、完全に黒ではありません。
JackWM 2013

確かに、この実装は、特定のデバイスとの統合に役立つ場合がありますが、公開リリースには使用しないでください。それは後で誰かのために役立つかもしれないので、私はポストを保ちます。
ılǝ

3

画面をオンにするには:

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

画面のデフォルトモードに戻る:フラグFLAG_KEEP_SCREEN_ONをクリアするだけ

getWindow().clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

3

これはマシュマロに取り組んでいます

private final String TAG = "OnOffScreen";
private PowerManager _powerManager;
private PowerManager.WakeLock _screenOffWakeLock;

public void turnOnScreen() {
    if (_screenOffWakeLock != null) {
        _screenOffWakeLock.release();
    }
}

public void turnOffScreen() {
    try {
        _powerManager = (PowerManager) this.getSystemService(POWER_SERVICE);
        if (_powerManager != null) {
            _screenOffWakeLock = _powerManager.newWakeLock(PROXIMITY_SCREEN_OFF_WAKE_LOCK, TAG);
            if (_screenOffWakeLock != null) {
                _screenOffWakeLock.acquire();
            }
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

あなたの回答がSOメンバーの理解を深めるのに役立つ理由を説明していただければ幸いです。
DKB

近接センサは、はるかに近いから行くときに、画面オフにすると...とてもうまく動作しない、画面が上...戻って来て、私はその前に、ウェイクロックを解除した場合、それはまだに来てすぐに
Michael

2

Androidのドキュメントに関しては、次のコード行を使用して実現できます。

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

これを自分のonCreateメソッドに追加しましたが、正常に動作します。

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

文書へのリンク:https ://developer.android.com/training/scheduling/wakelock.html


2

アプリがシステムアプリの場合、PowerManager.goToSleep()を使用して画面をオフにできます。特別な権限が必要です

goToSleep()を使用する前に、次のようにリフレクションを使用する必要があります。

public static void goToSleep(Context context) {
    PowerManager powerManager= (PowerManager)context.getSystemService(Context.POWER_SERVICE);
    try {
        powerManager.getClass().getMethod("goToSleep", new Class[]{long.class}).invoke(powerManager, SystemClock.uptimeMillis());
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }
}

これで、goToSleep()を使用して画面をオフにできます。

これは、電源キーを押して画面をオフにしたときに起こります。


2

追加するだけ

android:keepScreenOn="true" 

または電話する

setKeepScreenOn(true) 

親ビューで。


1

アクティビティで「画面を覚ます」という希望はありません。画面がオフの場合、アクティビティはおそらく一時停止状態であり、コードを実行するべきではありません。

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

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

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


応答ありがとうございます。バイブレーションコードを挿入しました。画面をオフにすると、センサーの1つをアクティブにすると振動します。したがって、コードは確実に実行されています。ロック画面は大したことではありません、私はただキーガードを使います。
thegreyspot 2012年

コードが実行されても、それはライフサイクルの外にあります。画面外のアクティビティは信用できません。ゲームダウンローダーを考えてみてください。ほとんどはアクティビティに記述されており、30秒から数分はそのままにしてダウンロードできますが、通常はOSが使用パターンに基づいてアクティビティを強制終了するため、動作しなくなります。
HaMMeReD 2012年

1

Android API 28以降では、画面をオンにするには以下を実行する必要があります

setShowWhenLocked(true); 
setTurnScreenOn(true); 
KeyguardManager keyguardManager = (KeyguardManager)
getSystemService(Context.KEYGUARD_SERVICE);
keyguardManager.requestDismissKeyguard(this, null);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.