Android 10からジェスチャーナビゲーションが使えるようになっています。
ジェスチャーナビゲーションは従来の操作方法と大きく異なり、アプリ側で対応も必要になってきますが、その際、アプリからシステムナビゲーションの種別がどれになっているか知りたくなります。
その方法を調べたのでご紹介。
設定アプリでシステムナビゲーションの選択をしている処理を覗いてみます。
SystemNavigationPreferenceController.java
に、ほぼそのままズバリなメソッドがあります。
static boolean isEdgeToEdgeEnabled(Context context) {
return NAV_BAR_MODE_GESTURAL == context.getResources().getInteger(
com.android.internal.R.integer.config_navBarInteractionMode);
}
ただ、一般アプリからではcom.android.internal.R.integer.config_navBarInteractionMode
を直接は参照できません。また、NAV_BAR_MODE_GESTURAL
も、ただのint値ですが WindowManagerPolicyConstants.java は @hide
なのでこちらも直接は参照できません。
あくまで直接は参照できないだけです。
一工夫して、以下のようなコードで判定できます。
private const val NAV_BAR_MODE_3BUTTON = 0
private const val NAV_BAR_MODE_2BUTTON = 1
private const val NAV_BAR_MODE_GESTURAL = 2
private val config_navBarInteractionMode: Int by lazy {
Resources.getSystem()
.getIdentifier("config_navBarInteractionMode", "integer", "android")
}
private fun getNavBarInteractionMode(context: Context): Int =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
context.resources.getInteger(config_navBarInteractionMode)
} else {
NAV_BAR_MODE_3BUTTON
}
fun is3ButtonNavigation(context: Context): Boolean =
getNavBarInteractionMode(context) == NAV_BAR_MODE_3BUTTON
fun is2ButtonNavigation(context: Context): Boolean =
getNavBarInteractionMode(context) == NAV_BAR_MODE_2BUTTON
fun isGestureNavigation(context: Context): Boolean =
getNavBarInteractionMode(context) == NAV_BAR_MODE_GESTURAL
Android 10未満は3ボタンに倒しています。Android 9にあったSwipe up home buttonのことは忘れましょう。Android 10以上で判定していますが、今後ナビゲーションがどうなるかも不明なので10以降で有効な方法かも不明です。
以上です。