web-dev-qa-db-ja.com

Wake Android Device up

ねえ、寝ているAndroid特定の時間にデバイスを起動する必要があります。何か提案はありますか?

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

36
Coxer

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

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

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

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

32
hackbod

画面を起動するには:

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

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

73
Yar

方法を見つけましたが、それほど複雑ではありません...どの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);
    }
};

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!");
7
mishkin

上記のフラグは廃止されているため、新しいデバイスではこのようなものを使用する必要があります。

_class AlarmActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_alarm)

        // Keep screen always on, unless the user interacts (wakes the mess up...)
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

        setTurnScreenOn(true)
        setShowWhenLocked(true)

        (getSystemService(KeyguardManager::class.Java) as KeyguardManager).requestDismissKeyguard(this,
            object: KeyguardManager.KeyguardDismissCallback(){
                override fun onDismissCancelled() {
                    Log.d("Keyguard", "Cancelled")
                }

                override fun onDismissError() {
                    Log.d("Keyguard", "Error")
                }

                override fun onDismissSucceeded() {
                    Log.d("Keyguard", "Success")
                }
            }
        )
    }
}
_

_KeyguardManager.requestDismissKeyguard_は、セッターsetTurnScreenOn(true)が以前に呼び出された場合にのみデバイスを起動します。

これを自分のAndroid Pieデバイスでテストしました。

1
Palm

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

@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);
}
1
Lahiru Chandima
getWindow().addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD);

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

0
Prativa

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

電話を自動的にロック解除する公開されたAPIがあるとは思わない。

0
schar