私はアプリケーションをAndroid Oに向けています。私のアプリケーションには、他のすべてのアプリケーションの上にウィンドウを表示するジョブサービスがあります。以前のAndroidバージョンでこの動作を達成しましたが、Android Oでは動作しません。期待した。
フラグTYPE_APPLICATION_OVERLAY
を使用する必要があることを読み、マニフェストファイルに許可<uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW"/>
も追加しました。
そのため、画面がオンのときは正常に動作しますが、画面がオフのときは画面がオンにならないことに気付き、画面をオンにしたとき、ウィンドウは他のアプリケーションの上に作成されていることがわかりました。
だから私の質問は、フラグFLAG_TURN_SCREEN_ON
およびFLAG_SHOW_WHEN_LOCKED
がAndroid API 27で非推奨になったので、それを行う代替方法は何ですか?
これは私の現在のコードです:
private void showView()
{
if (!wakeLockAcquired)
{
wakeLock.acquire();
wakeLockAquired = true;
}
windowManager = (WindowManager)context.getSystemService(WINDOW_SERVICE);
final WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, 0, 0,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
,
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON ,
PixelFormat.RGBA_8888);
RelativeLayout layout = buildView();
windowManager.addView(layout, layoutParams);
windowManager.updateViewLayout(layout, layoutParams);
}
注:
わかりましたので、いくつかの回避策と@Umairの回答からの助けを借りて解決できました。
WindowManagerを使用してバックグラウンドサービスで作成されたビューを表示し、上記の質問に追加したコードを使用すると、ビューは他のすべてのアプリケーションの上に表示されますが、AndroidバージョンはAndroid 8.です。
現在、フラグを置き換えるメソッド:_FLAG_SHOW_WHEN_LOCKED
_ _FLAG_TURN_SCREEN_ON
_は、サービスまたはWindowManagerではなくアクティビティに表示され、コンテキストをActivityにキャストすることはお勧めできません。
したがって、私が今やったこと(一時的な解決策)は、透過的なアクティビティを作成し、バックグラウンドサービスからshowView()
メソッドを呼び出すときに、透過的なアクティビティも開始することです。
アクティビティ-onCreateメソッド内で、メソッドを呼び出しています:
_setShowWhenLocked(true)
setTurnScreenOn(true)
_
また、ビューが破棄されると、アクティビティはブロードキャストレシーバーの助けを借りて破壊されます。画面がオンになり、ビューが他のすべてのアプリケーションよりも上になります。
サービス内のコードを新しいアクティビティに移動できることを教えていただけると思います。
そのようにした理由:
私は音声認識エンジンを使用しています。アクティビティでコーディングすると、機能しませんでした。画面がパターンでロックされている場合、アクティビティは一時停止状態になり、結果を取得できません。そのため、パターンは私の活動を却下しました。
そこで、ウィンドウマネージャーを使用してビューを作成することにしましたが、今までは問題なく機能していました-Google(Androidチーム)がこれらのフラグを廃止することを決めたとき。だから、これは今のところ私の解決策です。そして、誰かがこの問題に対するより良い解決策を見つけることを願っています。
Attr turnScreenOnがtrueの場合、KeyguardManagerは画面をオンにします。そのため、メソッドの順序とrequestDismissKeyguardの呼び出しが必要です。このコードをアクティビティに使用します。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
setShowWhenLocked(true)
setTurnScreenOn(true)
val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
keyguardManager.requestDismissKeyguard(this, null)
} else {
this.window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
}
}
したがって、Androidのドキュメントによれば、これらのメソッドは廃止されたため、代わりにshowWhenLocked or setShowWhenLocked(boolean)
を使用する必要があります。
FLAG_TURN_SCREEN_ON
int FLAG_TURN_SCREEN_ONこの定数はAPIレベル27で廃止されました。代わりにturnScreenOnまたはsetTurnScreenOn(boolean)を使用して、意図しない二重のライフサイクルイベントを防ぎます。
ウィンドウフラグ:ウィンドウが追加または表示されるように設定されている場合、ウィンドウが表示されると、システムは(ユーザーがデバイスを起動したかのように)パワーマネージャーのユーザーアクティビティを突いて画面をオンにします。
そしてFLAG_SHOW_WHEN_LOCKED
int FLAG_SHOW_WHEN_LOCKEDこの定数は、APIレベル27で廃止されました。代わりに、showWhenLockedまたはsetShowWhenLocked(boolean)を使用して、意図しない二重ライフサイクルイベントを防止します。
ウィンドウフラグ:画面がロックされているときにウィンドウが表示されるようにする特別なフラグ。これにより、アプリケーションウィンドウがキーガードや他のロック画面よりも優先されます。 FLAG_KEEP_SCREEN_ONと共に使用して、キーガードウィンドウを表示する前に、画面をオンにしてウィンドウを直接表示できます。 FLAG_DISMISS_KEYGUARDとともに使用して、非セキュアキーガードを自動的に完全に破棄できます。このフラグは、最上部のフルスクリーンウィンドウにのみ適用されます。
そのため、ドキュメントによると、これらのメソッドを廃止する理由は、an unintentional double life-cycle event.
これらの詳細については、こちらをご覧ください。 https://developer.Android.com/reference/Android/view/WindowManager.LayoutParams.html
あなたはそれを経験しますか
setShowWhenLocked(true)
setTurnScreenOn(true)
Android 9?で画面をオンにしないでください。それとも私の場合ですか?
上記のDmitry Ognyovが投稿したように、これらに加えて:setShowWhenLocked(true); setTurnScreenOn(true);
キーガードも解除する必要がありますkeyguardManager.requestDismissKeyguard(...