🦔

Android クイック設定にタイルを追加する方法

2022/04/02に公開

クイック設定(quick settings)の実装方法について、たまにしか書かない=忘れがちなのでメモ。

実装方法

  1. TileServiceを継承したサービスを実装する
  2. AndroidManifest.xmlに1で実装したサービスを追加する

大枠はこれだけで、かなりお手軽に実装できる。ツール系アプリを作る際は選択肢に入れると良いかと。

詳細

https://developer.android.com/reference/android/service/quicksettings/TileService

上記ドキュメントにすべて書いてあるので、書いてある通りに実装していけば良い。

TileService#onStartListening()

ステータスバーを下にスワイプし、クイック設定が見えるようになる良い感じのタイミングで呼ばれるコールバック。
ここで「設定が有効かどうか」の判定を行い、タイルの状態を更新する。

TileService#onStopListening()

クイック設定を閉じた際に呼ばれるコールバック。
例えばContentResolverの変更イベントによってタイルの状態を切り替える場合は、以下のように実装する。

  1. onStartListening()でContentResolver#registerContentObserver()を実行する。コールバックでgetQsTile()を使ってタイルの状態を更新する
  2. onStopListening()でContentResolver#unregisterContentObserver()を実行し、監視を終了する

TileService#getQsTile()

Tileのインスタンスを取得できる。
onStartListening()の後からonStopListening()の前まで利用可能。

Tile#setState()

以下のいずれかを設定する。

  1. STATE_UNAVAILABLE (押せない)
  2. STATE_INACTIVE (押せる・OFF)
  3. STATE_ACTIVE (押せる・ON)

例えば、初期設定が終わっていない場合はSTATE_UNAVAILABLE、終わっていればSTATE_INACTIVEもしくはSTATE_ACTIVEを適切な方に設定する。

Tile#updateTile()

タイルの状態を更新する。関数名のまま。

参考になるソースコード

開発者向けオプション>クイック設定開発者用タイルのソースコード
https://cs.android.com/android/platform/superproject/+/master:packages/apps/Settings/src/com/android/settings/development/qstile/DevelopmentTiles.java

何も考えずに実装すると、ロック画面でもON/OFF切り替えが可能になる。
デバッグ用タイルのいくつかは、KeyguardManager#isKeyguardLocked()を使って「ロック画面だとONに切り替えられない」ように実装されている。セキュアな設定項目を自作する場合は参考にすると良い。

Discussion