Android 7.0 Nougatでクイック設定(Quick Setting)を追加する
Android 7.0 Nougatで新しく追加されたTile APIを利用することで、クイック設定(下図)を自作することができます。
今回は上記リンクを参考に、クイック設定の追加方法について見ていきます。
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・・・クイック設定のタイルとして動作している時にクイック設定アイコンがタップされた
ここまでくると、下図のように自分で作ったクイック設定を追加することができます。
あとはonClickコールバックメソッドの中で行いたい設定の処理を記述していきます。
サンプルでは、クイック設定アイコンがタップされた時に、Tileクラスのインスタンスを取得し、タイルの状態(アクティブ/インアクティブ)を調べて変更しています。
今回はこんなところです。