仕様の変更で、使えなくなったレイヤーは以下の通り。
TYPE_PHONE
TYPE_PRIORITY_PHONE
TYPE_SYSTEM_ALERT
TYPE_SYSTEM_OVERLAY
TYPE_SYSTEM_ERROR
で、代わりに「TYPE_APPLICATION_OVERLAY」を使ってね。という事らしい。
試しに今までNougat(Android 7.0)で問題なく動作していた、現在作成中の赤ちゃん対策ロックアプリをそのまま動かしてみると、ロック画面表示でException発生・・・。
android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@a5b5602 -- permission denied for window type 2010ナビゲーションバーのボタンを抑止するため、ロック用のレイヤーを「TYPE_SYSTEM_ERROR」に表示していたけど、Oreoからは使っちゃいけないレイヤーになってしまいました。
アプリの設定で、「重ねて表示する」許可をONにしても、当然ダメ。
仕方がないのでロックレイヤーのパラメータを以下に変更。
_prms = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
// ★以前のバージョン
// WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
// ★修正後
((Build.VERSION.SDK_INT >= 26) ?
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY :
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR),
// ★ココマデ
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN |
WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR |
WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION |
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS |
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED |
WindowManager.LayoutParams.FLAG_FULLSCREEN |
WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
PixelFormat.TRANSLUCENT);
コレでなんとかロック画面は出せたけど、画面上下隅からのスワイプとか、ホームボタンが抑止できなくなってしまいました。
他に公開されているロックアプリも試してみたけど、やはり同様にナビゲーションバーはロックできず、全画面表示とか、ナビゲーションバー非表示にして、スワイプで表示されたら直後に非表示にさせるなど、苦肉の方法をとっているみたい。
コレ、Oreo以降はベンダー以外ちゃんとしたロックアプリ作れないんじゃないだろうか?
あるいはおいらが調査不足なだけ・・・?
赤ちゃん、間違いなく画面外からのスワイプ・・・するよ・・・。