web-dev-qa-db-ja.com

Android O-FLAG_SHOW_WHEN_LOCKEDは非推奨です

私はアプリケーションを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);
}

注:

  • buildViewはrelativeLayoutを返す関数です。この関数では、コンテンツ(TextView、ImageViewなど)を動的に追加しています。
  • wakeLockAcquiredはブール値のメンバーであり、ビューが破棄されるとfalseに設定されます。
12
Elior

わかりましたので、いくつかの回避策と@Umairの回答からの助けを借りて解決できました。

WindowManagerを使用してバックグラウンドサービスで作成されたビューを表示し、上記の質問に追加したコードを使用すると、ビューは他のすべてのアプリケーションの上に表示されますが、AndroidバージョンはAndroid 8.です。

現在、フラグを置き換えるメソッド:_FLAG_SHOW_WHEN_LOCKED_ _FLAG_TURN_SCREEN_ON_は、サービスまたはWindowManagerではなくアクティビティに表示され、コンテキストをActivityにキャストすることはお勧めできません。

したがって、私が今やったこと(一時的な解決策)は、透過的なアクティビティを作成し、バックグラウンドサービスからshowView()メソッドを呼び出すときに、透過的なアクティビティも開始することです。

アクティビティ-onCreateメソッド内で、メソッドを呼び出しています:

_setShowWhenLocked(true) 
setTurnScreenOn(true)
_

また、ビューが破棄されると、アクティビティはブロードキャストレシーバーの助けを借りて破壊されます。画面がオンになり、ビューが他のすべてのアプリケーションよりも上になります。

サービス内のコードを新しいアクティビティに移動できることを教えていただけると思います。

そのようにした理由:

私は音声認識エンジンを使用しています。アクティビティでコーディングすると、機能しませんでした。画面がパターンでロックされている場合、アクティビティは一時停止状態になり、結果を取得できません。そのため、パターンは私の活動を却下しました。

そこで、ウィンドウマネージャーを使用してビューを作成することにしましたが、今までは問題なく機能していました-Google(Androidチーム)がこれらのフラグを廃止することを決めたとき。だから、これは今のところ私の解決策です。そして、誰かがこの問題に対するより良い解決策を見つけることを願っています。

8
Elior

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)
    }
}
12
Dmitry Ognyov

したがって、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

7
Umair

あなたはそれを経験しますか

setShowWhenLocked(true)
setTurnScreenOn(true)

Android 9?で画面をオンにしないでください。それとも私の場合ですか?

1
Perry

上記のDmitry Ognyovが投稿したように、これらに加えて:setShowWhenLocked(true); setTurnScreenOn(true);キーガードも解除する必要がありますkeyguardManager.requestDismissKeyguard(...

0