📘

Android機種依存の困りごと色々

2024/12/02に公開

はじめに

これは、U-NEXT Advent Calendar 2024 2日目の記事です。
U-NEXTでAndroidエンジニアとして働いているtomoya0x00です。

最近のAndroidアプリ開発は昔に比べて機種依存の挙動で悩むことが減った?という話しを聞くのですが、
個人的にはU-NEXTに入社してから様々な機種依存を体験できました。

この記事では特に印象深かった機種依存の挙動について、いくつかご紹介します。

Android機種依存の困りごと紹介

挙動が謎:WindowInsetsControllerCompatでViewのレイアウトが壊れる

発生を確認した端末

  • Zenfone 3 Android 8
  • Lenovo IdeaPad Duet Chromebook

現象

WindowInsetsControllerCompatでシステムバーを隠したり挙動の変更をすると、Viewのレイアウトが壊れてしまう。

insetsController.run {
    hide(WindowInsetsCompat.Type.systemBars())
    systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}

(昔の話しなのでうろ覚えですが)wrap_contentかmatch_parent指定によるレイアウトサイズ計算がおかしくなるため、レイアウトが崩れます。

対策

WindowInsetsControllerCompatの使用を避け、昔ながらのactivity.window.decorView.systemUiVisibilityでシステムバーを弄ります。

activity.window.decorView.systemUiVisibilityでは一回の変更でシステムバーの表示・非表示と挙動の変更をおこなえますが、WindowInsetsControllerCompatを使うと内部では複数回のactivity.window.decorView.systemUiVisibility変更が実行されます。
恐らく、これにより一部端末の秘孔を突いてしまい、このような謎のレイアウト破壊を引き起こしてしまうのだと思われます。

オマケ話

下記の端末ではActivity生成・表示直後のsystemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPEが効きません。
2秒ほど遅延させてsetすると効くので、恐らくAndroid 11のバグだと思われます。もしWindowInsetsController or WindowInsetsControllerCompatを使う場合、これらの使用はAndroid 12以上に限定した方が安全かもしれません。

  • OPPO Reno5 A Android 11
  • Android One S8 Android 11
  • Pixel 3 Android 11
  • Motorola Razr Android 11

他社アプリでは対策済み!?:一時停止中のビデオが勝手に進んでしまう

発生を確認した端末

  • Fire HD8(第12世代)OS8.3.1.9
  • Fire HD10(第11世代)OS7.3.2.8

現象

再生中のビデオを一時停止してアプリをバックグラウンドに遷移。再度フォアグラウンドにすると一時停止中なのに表示している映像は少し先に進んでしまいます

対策

結論から言うと、Fireタブレット向けのアプリでは「一時停止中にプレイヤーをバックグラウンドに移動したらプレイヤーを閉じる」という挙動にしました。

どうやらFireタブレット(の一部?)は、記載した現象が発生してしまうようです。この現象それ自体の回避策自体は見つけられませんでした。

オマケ話

実は、下記のアプリはGoogle Play向けとFireタブレット向けで挙動が異なります。

  • Netflix
  • Amazon Prime Video

Fireタブレット向けのアプリでは、ビデオを一時停止してからバックグラウンドに遷移後に再度フォアグラウンドにすると、プレイヤーが閉じられています。
恐らく、Fireタブレットの本現象を把握しており、対策としてFireタブレット向けアプリでのみプレイヤーの挙動を変更しているのでしょう。

Composeアプリでだけ発生!:タップ位置がずれる

発生を確認した端末

  • FireMax11(第13世代) OS 8.3.2.1

現象

ComposeでUIを作成したアプリでのみ起こる現象です。
画面をタップすると、前回タップした場所をタップしたことになってしまいます。

  • 1回目のタップ -> 正常に動作
  • 2回目のタップ -> 1回目のタップ位置をタップしたことになる
  • 3回目のタップ -> 2回目のタップ位置をタップしたことになる

対策

新しめのFireタブレットの一部で、Composeアプリのタップ位置がずれる で紹介していますが、ComposeViewを差し替えて問題を回避しました。

オマケ話

最近のFireOSのアップデートで本不具合は修正されたようです。

とても困る:Actiivtyが表示出来ない

発生を確認した端末

  • Fire HD 8 第10世代
  • Fire HD 10 第9世代

現象

透明を含むActivityがかなりの確率で表示できません。

対策

Activityでは必ず透明表示を避けます。

現象が致命的:Google Castで端末操作不能

発生を確認した端末

  • OnePlus6T Android 11
  • OPPO Reno5 A Android 11
  • LAVIE Tab E 10FHD2 Android 10

現象

Google Cast接続状態でビデオ再生を開始すると、キャスト元の端末が画面ON/OFFを繰り返したり端末自体がリブートしてしまいます。

対策

Cast再生中は端末の通知バーにCastの再生コントローラーが表示されますが、このコントローラー背景画像が巨大だとこの現象が起きてしまうようです。

OptionsProviderで提供するCastOptionsにはCastMediaOptionsを指定できますが、その中で独自のImagePickerを指定できます。この独自ImagePickerで端末が使用する画像のサイズに制限をかければOKです。

色々なアプリで問題発生:日本語変換できない

発生を確認した端末

  • POBox PlusをIMEとして設定しているXperia端末

現象

Compose 1.7のTextFieldではPOBox Plusで日本語変換できない(例:ひらがなから漢字に変換できない)

対策

主に二通りの対策があります。U-NEXTでは後者を採用しています。

  • Compose 1.7に本現象の対策が含まれるまで、Compose 1.6を使い続ける
  • TextFieldをAndroid ViewのEditTextに置き換える
    • いくつか他の問題に対応する必要があるため、こちらの記事をご参照ください

おわりに

いかがでしたか?こうして振り返ってみると色々と機種依存の挙動がありますね!
皆さんも是非「自分はこんな機種依存の挙動を見つけてこのように対応したよ!」というのを共有して頂けると、とても嬉しいです。

明日12月3日は楠達矢さんによる「U-NEXTでやってる漫画の話」です。お楽しみに!!
https://adventar.org/calendars/10344

Discussion