web-dev-qa-db-ja.com

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

ただし、このメソッドは表示をオフにしません。

28
NebulaSleuth

最後にそれを理解しました。それが役に立てば幸い。 :)

  • 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にビューを追加します。

    windowManager.addView(view, layoutParams);

注:画面にオーバーレイを配置するには、_SYSTEM_ALERT_WINDOW_権限が必要です。

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

これをテストし、それは動作します。行き詰まった場合はお知らせください。

7

サービスがある場合はウェイクロックを使用しますが、アクティビティ側から行う場合は、フラグを使用してフラグを取得することをお勧めします。

        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 から他のフラグを探索します

Fyiはもう1つあります。 Androidで非表示のAPIを呼び出して画面をオフにします

1
kodeshpa

それがあなたに役立つかどうかはわかりませんが、あなたは単にウェイクロックを使用して、あなたの画面が継続し、黒い画像を表示するimageviewを表示することができます

0
Alexander Fuchs

部分的なウェイクロックを取得し、次を使用して画面をオフにすることができます。

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
Sanober Malik