44

スリープ状態の Android デバイスを特定の時間に起動する必要があります。助言がありますか?

PS ウェイクアップ: ディスプレイをオンにして、おそらく電話のロックを解除します

4

8 に答える 8

79

画面をウェイクアップするには:

PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = pm.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "TAG");
wakeLock.acquire();

画面ロックを解除するには:

KeyguardManager keyguardManager = (KeyguardManager) getApplicationContext().getSystemService(Context.KEYGUARD_SERVICE); 
KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("TAG");
keyguardLock.disableKeyguard();

また、マニフェストには次を含める必要があります。

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

PowerManager の詳細については、API ドキュメントを参照してください: http://developer.android.com/reference/android/os/PowerManager.html

編集:この回答は非推奨として報告されています。

于 2012-04-16T18:55:03.273 に答える
35

これらのウィンドウ フラグを適切に組み合わせて使用​​することをお勧めします。

http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_DISMISS_KEYGUARD
http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_SHOW_WHEN_LOCKED
http:// developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_KEEP_SCREEN_ON
http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_TURN_SCREEN_ON

必要なフラグをサポートしていない古いバージョンのプラットフォームで実行したい場合は、ウェイク ロックとキーガード ロックを直接使用できますが、その方法には危険が伴います。

1 つの重要な注意:上記のフラグの組み合わせを機能させるには、アクティビティを全画面表示にする必要があります。私のアプリでは、全画面表示ではないアクティビティ (ダイアログ テーマ) でこれらのフラグを使用しようとしましたが、機能しませんでした。ドキュメントを見た後、これらのフラグを使用するには、ウィンドウをフルスクリーン ウィンドウにする必要があることがわかりました。

于 2010-09-02T01:09:06.980 に答える
8

私は方法を見つけましたが、それほど複雑ではありません...どのAPIバージョンでも機能します。

メソッドを使用PowerManager.userActivity(l, false)し、SCREEN_OFFインテントで受信したブロードキャストとしてアクティビティを登録する必要があります。

あなたの活動にOnCreateは次のようなものを入れます:

mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.v(TAG, "Screen OFF onReceive()");
        screenOFFHandler.sendEmptyMessageDelayed(0, 2000L);
    }
};

ScreenOffイベントの2秒後にハンドラーを開始します。

onResume()メソッドにレシーバーを登録します。

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
registerReceiver(mReceiver, filter);
Log.i(TAG, "broadcast receiver registered!");

次のようなハンドラーを作成します。

private Handler screenOFFHandler = new Handler() {

    @Override
    public void handleMessage(Message msg) {

        super.handleMessage(msg);
        // do something
        // wake up phone
        Log.i(TAG, "ake up the phone and disable keyguard");
        PowerManager powerManager = (PowerManager) YourActivityName.this
                .getSystemService(Context.POWER_SERVICE);
        long l = SystemClock.uptimeMillis();
        powerManager.userActivity(l, false);//false will bring the screen back as bright as it was, true - will dim it
    }
};

マニフェストファイルで許可をリクエストします。

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

終わったら、放送受信機の登録を解除することを忘れないでください。たとえば、onDestroy()でこれを行うことができます(これは保証されていません)

unregisterReceiver(mReceiver);
Log.i(TAG, "broadcast UNregistred!");
于 2010-12-27T21:32:50.640 に答える
2

setContentView(R.layout.YOUR_LAYOUT);アクティビティonCreate()メソッドの後に以下のコードを試してください

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
        Log.d(TAG, "onCreate: set window flags for API level > 27");
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
                        | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        KeyguardManager keyguardManager = (KeyguardManager) getApplicationContext().getSystemService(Context.KEYGUARD_SERVICE);
        keyguardManager.requestDismissKeyguard(this, null);
        setShowWhenLocked(true);
        setTurnScreenOn(true);
    } else {
        Log.d(TAG, "onCreate: onCreate:set window flags for API level < 27");
        getWindow().addFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN
                        | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                        | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    }
于 2020-08-11T13:32:54.563 に答える
2

ウェイクアップ時にウィンドウを表示している場合、ウェイクロックを使用せずに、アクティビティにいくつかのフラグを追加するだけで簡単に機能させることができます。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_activity);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}
于 2017-01-21T15:59:08.770 に答える
1
getWindow().addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD);

一般的なキーガードを解除し、デバイスのロックを解除します。

于 2014-01-12T12:09:32.310 に答える
1

プログラムでアラームを設定すると、電話が起動し(音を鳴らします)、ディスプレイをオンにするオプションがあると思います。

電話を自動的にロック解除する API が公開されるとは思えません。

于 2010-09-01T19:48:10.193 に答える