techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

Android 7.0 Nougatでクイック設定(Quick Setting)を追加する

Android 7.0 Nougatで新しく追加されたTile APIを利用することで、クイック設定(下図)を自作することができます。
f:id:uentseit:20160901225549p:plain:w200 f:id:uentseit:20160901225835p:plain:w200

developer.android.com

developer.android.com

今回は上記リンクを参考に、クイック設定の追加方法について見ていきます。

TileServiceを作成する

クイック設定を追加するには、TileServiceクラスを継承したクラスを用意します。
今回は以下のようなクラスを作りました。各コールバックメソッドでログを吐くだけです。

@TargetApi(Build.VERSION_CODES.N)
public class QuickSettingTileService extends TileService {
    public QuickSettingTileService() {
    }

    /**
     * Quick Settingのアイコンがタップされたら呼ばれる
     */
    @Override
    public void onClick(){
        Log.d("seir", "onClick called");
        Tile tile = getQsTile(); // タップされたクイック設定タイルのインスタンスを取得

        switch (tile.getState()){
            case Tile.STATE_ACTIVE:
                tile.setState(Tile.STATE_INACTIVE);
                break;
            case Tile.STATE_INACTIVE:
                tile.setState(Tile.STATE_ACTIVE);
                break;
            default:
                break;
        }

        tile.updateTile(); // タイルの情報を更新する
    }

    @Override
    public void onTileAdded(){
        Log.d("seit", "onTileAdded is called");
    }

    @Override
    public void onTileRemoved(){
        Log.d("seit", "onTileRemoved is called");
    }

    @Override
    public void onStartListening(){
        Log.d("seit", "onStartListening is called");
    }

    @Override
    public void onStopListening(){
        Log.d("seit", "onStopListening is called");
    }
}

AndroidManifestの定義は以下のようにします。

        <service
            android:name=".QuickSettingTileService"
            android:label="@string/my_default_tile_label"
            android:icon="@drawable/my_quick_setting_icon"
            android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
            <intent-filter>
                <action android:name="android.service.quicksettings.action.QS_TILE" />
            </intent-filter>
        </service>

PermissionとIntent filterのactionに、それぞれ"android.permission.BIND_QUICK_SETTINGS_TILE"と"android.service.quicksettings.action.QS_TILE"を指定しておけば、システムがクイック設定に追加できるタイルとして検出してくれます(下図2番目)。
iconはクイック設定のアイコンに、labelはアイコン設定のラベルになります(下図4番目)。
TileServiceの各コールバックメソッドはそれぞれ以下のタイミングで呼ばれます。

onTileAdded・・・クイック設定のタイルがクイック設定の一覧に追加された時(下図3番目)
onTileRemoved・・・クイック設定のタイルがクイック設定の一覧から削除された時
onStartListening・・・クイック設定のタイルとして動作し始めた
onStopListening・・・クイック設定のタイルとしての動作を終了
onClick・・・クイック設定のタイルとして動作している時にクイック設定アイコンがタップされた

ここまでくると、下図のように自分で作ったクイック設定を追加することができます。
f:id:uentseit:20160901233226p:plain:w200 f:id:uentseit:20160902020020p:plain:w200 f:id:uentseit:20160901233236p:plain:w200 f:id:uentseit:20160901233708p:plain:w200

あとはonClickコールバックメソッドの中で行いたい設定の処理を記述していきます。
サンプルでは、クイック設定アイコンがタップされた時に、Tileクラスのインスタンスを取得し、タイルの状態(アクティブ/インアクティブ)を調べて変更しています。

今回はこんなところです。