Android
DroidKaigi
kiosk

Kioskアプリと端末の作り方 ~DroidKaigi2018発表内容の要約+α~

はじめに

光栄なことに「Kioskアプリと端末の作り方」というテーマで DroidKaigi 2018 に登壇させて頂きました。
セッションにお越し頂いた方々、ありがとうございました!

本記事は発表内容の要約+オフィスアワーでのお話し、です。

本記事の対象者

本記事の対象者は下記の通りです。

  • セッションに参加したが、その後のオフィスアワーでどのような話があったのか気になる
  • セッションは不参加だが、要点だけをざっくり確認したい

発表動画

https://www.youtube.com/watch?v=ofUJaIiaVlw

発表資料

GIFアニメ無し
https://speakerdeck.com/tomoya0x00/kioskapuritoduan-mo-falsezuo-rifang

GIFアニメ有り(環境によってはちょっとレイアウト崩れるかも)
https://docs.google.com/presentation/d/1K9-Tn13yRAyOmN480DhchDTchVANaUDMn5y4gvRpoLc/edit?usp=sharing

サンプルソース
https://goo.gl/ryz8mX

発表内容の要約

Kiosk端末とは?

  • 特定用途に特化した情報端末
  • 回転寿司屋や居酒屋に設置してあるタッチパネルなど

Kiosk端末の実現方法

  • DeviceOwnerをうまく活用する
    • 端末に様々な制約を課すことが出来る特別な管理者
    • Android 5.0から追加された
    • 基本的に端末の初期化が必要
  • Lock task mode
    • 特定アプリ以外への遷移を制限できる
    • DeviceOwnerで許可されたアプリだけが開始できる
  • 強制的にホームアプリ化
    • DevicePolicyManager#addPersistentPreferredActivity でできる
    • DeviceOwner権限が必要
  • DeviceOwner指定時の注意点
    • 端末のファクトリーリセット後、極力初期設定をスキップすること
    • WiFiやアカウント設定してしまうと、DeviceOwnerの指定に失敗することがある
      • 挙動は端末依存

活用事例紹介

実際のサービスで活用しているDeviceOwnerの機能紹介

  • サイレントインストール
  • ワイプ
  • USBデバッグOFF
  • スクリーンショットOFF

Kiosk端末開発のノウハウ

  • バッテリー残量と電波強度が表示されない
    • Lock task modeではステータスバーが表示されない
    • APIで取得してアプリ内で表示
  • ホームアプリ化すると再起動後にロック画面が表示される
    • 設定でロック画面無しにする
  • Kioskアプリが落ちると他画面に遷移できてしまう
    • 例外処理を横取りして自分自身を再起動させる
  • 端末起動直後のアップデート確認処理が毎回失敗する
    • 端末起動直後はネットワーク接続確立されてないので注意
    • リトライ回数や間隔を増やしましょう
  • ホームアプリ化が解除されない
    • DeviceOwner権限削除前にホームアプリ化解除 or セキュリティ->端末管理アプリからチェック外してadb uninstall
  • デバッグメニューが欲しい
    • Activityの邪魔にならない箇所にデバッグメニュー表示ボタンを置いておく

オフィスアワーでのお話し

※公開するとマズイお話しがある場合、ご連絡ください。

  • セーフモードではKioskアプリの起動を回避できてしまうのでは?
    • いいえ。回避は出来ず、Kioskアプリが起動します。
    • この回答は自分では無く、 DroidKaigi 2018 サポーター アイキューブドシステムズ 所属のエンジニア様が答えてくださいました!ありがとうございます。
  • ユーザー様側でKiosk端末化をお願いすることはできそうか?
    • NFCを使えばワンタッチでKiosk化できるみたいですが、試せていません。
    • 弊社では端末セットアップ手順書を作成し、キッティング作業を専用の会社様に委託しています。
  • Kioskアプリ自体をサイレントインストールでアップデートできるか?
    • 今回のサンプルソースでは試せていませんが、できると思います。
  • オフィスアワーで電源ボタン無効化の話題があったが、電源ボタンの長押しを onWindowFocuschanged() で検出(電源オフするか確認のダイアログが表示されるので)し、自分自身を起動することで回避できる。
    • 株式会社東京 のエンジニア様に教えていただきました!ありがとうございます!

最後に

発表準備は大変(公の場での発表はこれまで5分LTだけだったので)でしたが、
皆様からのフィードバックを頂き「発表して良かった!」という気持ちが強いです。
(特にKiosk化の苦労を分かち合えたのが嬉しい)

また、逆に開発ノウハウを教えて頂く事もあり、「情報を発信すると情報が集まってくる」を実感いたしました。

次はもっとうまく発表できるように頑張ります!