🔦

FlutterでAndroid15の画面輝度を上げたときに明滅するバグの対応方法

に公開

概要

  • アプリでバーコードを表示する機能があり、バーコードをタップすると画面輝度を上げてリーダーに読み取りやすくするという機能はよくあると思います
  • 輝度を上げた際に一定時間後に明滅する現象が特定端末で起きていました

実装環境

  • flutter: 3.32.2
  • screen_brightness: 1.0.0
    • 画面輝度を変えるプラグイン

再現端末

  • Pixel9 Android15(BP1A.250305.020)
  • Pixel7Pro Android15(BP1A.250305.019)
  • 蛇足ですが、PixelであればAndroid Flash Toolを使うことで任意のOSバージョンにできるので便利です

再現条件

  • Android15(2025年3月版のみ?)
    • iOS17,Android13,16では再現せず
  • 端末が高リフレッシュレート(90-120hz)に対応している
  • 端末のスムーズディスプレイをオンにしている(高リフレッシュレート表示)
  • Pixel9だと開発者向けオプションのスリープしない設定をオンにしている(Pixel7Proではオンオフ関係なく起きていた)

対応方法

  • flutter_displaymode を使って、輝度を上げたときにリフレッシュレートを上げる
  • 輝度を下げるときにリフレッシュレートを下げる(高リフレッシュレートのままだとバッテリー消費があがるため)
  • はじめは flutter_refresh_rate_control を試しましたが、レートを下げるようにしても下がらなかったため上記プラグインを使用してます

以下調査メモ

PixelTabletで再現しない

  • 最初はPixelTabletにAndroid15を入れて確認しましたが再現しませんでした
  • 理由はPixelTabletが高リフレッシュレートに対応してないからでした

Android15の3月版はリフレッシュレート関連のバグがあるらしい?

リフレッシュレートの表示方法

  • 開発者向けオプションから「リフレッシュレートの表示」をオンで画面左上に固定表示される

Pixel9とPixel7Proで挙動が違う?

  • この要因は無印とProとでリフレッシュレート幅が異なり、無印の場合は 90hz or 120hz ですが、Proだと1hz or 90hz or 120hz を行き来するようになっていたため挙動が異なっていた

UI更新と関係ある?

  • はじめは画面内のカルーセルが動くタイミングと連動して起きてそうだったが、カルーセルを外しても1回は起きていた

スリープと関係ある?

  • スリープタイミングで明滅してるのでは?と思い、開発者向けオプションで充電時はスリープしないをしても起きていた

画面自動消灯と関係ある?

  • スリープとは別に画面自動消灯というのもあり、これを30分と長くしても1回は明滅してしまっていた
  • 画面自動消灯をWakeLockPlusなどで常時点灯にしても起きていた

他のアプリだと?

  • 他のアプリでも起きたり起きなかったりしていた
  • Flutterとネイティブで動作が違うのかもしれないがあまり調べられなかった

Discussion