😽

Android カスタム クイック設定タイルにアプリを追加

2024/08/30に公開

カスタムクイック設定タイルにアプリを追加して、押下時にシステム音量表示をする実装。

TileServiceを起動すれば基本的にはOKなので継承した任意のクラスを定義。

class QuickTileService : TileService() {
    override fun onTileAdded() {
        super.onTileAdded()

        qsTile.state = Tile.STATE_ACTIVE
        qsTile.subtitle = "Tap Here"
        qsTile.updateTile()
    }

    override fun onStartListening() {
        super.onStartListening()

        qsTile.state = Tile.STATE_ACTIVE
        qsTile.subtitle = "Tap Here"
        qsTile.updateTile()
    }

    override fun onStopListening() {
        super.onStopListening()
        // no-op
    }

    override fun onClick() {
        if (qsTile.state == Tile.STATE_INACTIVE) {
            return
        }

        super.onClick()

        qsTile.state = Tile.STATE_INACTIVE
        qsTile.updateTile()

        // システム音量バーを表示
        val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
        audioManager.adjustVolume(AudioManager.ADJUST_SAME, AudioManager.FLAG_SHOW_UI)

        // 2秒後にアクティブに戻す
        Handler(Looper.getMainLooper()).postDelayed({
            qsTile.state = Tile.STATE_ACTIVE
            qsTile.updateTile()
        }, 2000)
    }
}
  • onTileAdded
    • 使用しないタイル位置からクイック通知タイルに追加された時
  • onStartListening
    • クイック通知でタイルを移動させた時
      • 使用するクイック通知欄で移動する度に呼ばれる
  • onStopListening
    • クイック通知でタイルを移動させた時
      • 使用するクイック通知欄で移動する度に呼ばれる
  • onClick
    • クイック通知が押下された時

今回はタイルは最初からアクティブ状態で、押下するとシステム音量バーが表示され、2秒後にタイルはアクティブに戻るようにした。
AudioManager#adjustStreamVolumeで特定の音量種類を指定して表示できそうに見えたが、実際にしてみると挙動が微妙だったのでやめておく。各音量操作をしたかったら独自のUIで実装したほうが良さそう。

あとは追加したServiceをManifestに追加するだけでOK。

        <service
            android:name=".QuickTileService"
            android:exported="true"
            android:icon="@drawable/ic_launcher_foreground"
            android:label="@string/quick_notification_panel_label"
            android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
            <intent-filter>
                <action android:name="android.service.quicksettings.action.QS_TILE" />
            </intent-filter>
        </service>
  • android:iconがクイック通知に表示されるアイコン
  • android:labelがクイック通知に表示される文言(1行目)
    • 2行目の、よくあるON/OFF状態表示などはコード側でqsTile.setSubbtitle

実際に作成したクイック通知タイルを利用した場合
quick_notification_tile

Discussion