ゲーム化!tomo_manaのブログ

ゲーム化!tomo-manaのブログ

Unityでゲームを作る方法について紹介しています

Unity×Android 強制的にスリープを解除する(Android10, 11)※調査中の記事

f:id:tomo_mana:20220330165234p:plain

強制的にスリープを解除する方法(備忘用の記事。調査中)


以下を参考にしました。
液晶パネルのWakeLockを取得し、Sleep状態からWake状態へ遷移する | TechBooster

実装

上のサイトにある通りのコードで、一応意図した動きになります。ただし、課題があります。

AndroidManifest.xml

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

import

import android.os.PowerManager;
import android.os.PowerManager.WakeLock;

処理

PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
PowerManager.WakeLock wakelock = 
        pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
        | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");

// スリープを解除
wakelock.acquire();

// この間だけスリープに入れなくなる(時間制限あり)

// これを呼ぶと再びスリープに入るようになる(すぐではない)
wakelock.release();

※上記コードは、Activity からだけでなく、Service からでも実行可能。

課題

PowerManager.FULL_WAKE_LOCK は非推奨

f:id:tomo_mana:20220314195608p:plain
PowerManager.newWakeLock

PowerManager  |  Android Developers


PowerManager.newWakeLock() の第一引数int levelAndFlagsに指定できるレベルには以下がありますが、FULL_WAKE_LOCK は非推奨です(API Level 17以降)。

wake lock level description
FULL_WAKE_LOCK 非推奨(API level 17以降)
SCREEN_BRIGHT_WAKE_LOCK 非推奨(API level 15以降)
SCREEN_DIM_WAKE_LOCK 非推奨(API level 17以降)
PARTIAL_WAKE_LOCK 画面明るくならない
PROXIMITY_SCREEN_OFF_WAKE_LOCK PARTIAL_WAKE_LOCKに似ているが、近接センサがActive


もっと言うと、指定可能なフラグはPARTIAL_WAKE_LOCKと、API21から追加されたPROXIMITY_SCREEN_OFF_WAKE_LOCK のみです。

f:id:tomo_mana:20220314200120p:plain
PowerMamager.FULL_WAKE_LOCK

FULL_WAKE_LOCK を含む非推奨となったラベルの説明には、いずれも代わりに WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON を使うように書かれています。

WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON

f:id:tomo_mana:20220314204744p:plain
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON

WindowManager.LayoutParams  |  Android Developers


推奨に従って、WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON を使ってみました。

しかし、PARTIAL_WAKE_LOCK + FLAG_KEEP_SCREEN_ON を組み合わせても、スクリーンをONにすることはできませんでした。属性は設定できるものの、スクリーンをONにする効果は無いようです。


尚、WindowManager.LayoutParams.FLAG_xxx は、 Window.setFlags() で設定します。WindowActivity.getWindow() で取得できます。

f:id:tomo_mana:20220314202114p:plain
Window.setFlags

Window  |  Android Developers

コード

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

Activity.setTurnScreenOn()

同じく、スクリーンをONにする処理として、Activity.setTurnScreenOn() があります。が、こちらも1回は起き上がってくるものの、2回目はうまくいきません。フラグを立てた後に落とす処理を入れても変わりませんでした。待ち時間を入れるなど、何か他に処理が必要なのかもしれません。

f:id:tomo_mana:20220314214501p:plain
Activity.setTurnScreenOn

Activity  |  Android Developers

コード

setTurnScreenOn( true );


今のところ、FULL_WAKE_LOCK の代替えとして提案されたものの中で、FULL_WAKE_LOCK と同等の処理ができる組み合わせが見つかっていません。ただ、着呼や電源供給時に同じような処理をしているはずで、探せばまだ方法があるように思います。


(以上)