Androidキオスク端末化の背景

Android端末で特定のアプリ以外は一切使えないように制限したい、という場合、自作のアプリであれば、下記の記事のような作り方で実現できますが、

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

ソースコードのいじれないGoogle Play Storeで公開されているアプリの場合、上記では対応できないため工夫が必要です。

そこで今回は、3rd Partyアプリでキオスク端末化する方法を紹介します。

概要としては、独自ホームアプリから特定のアプリ以外は起動できないようにします。 また、端末の設定変更もできないようにします。

キオスク端末とは?

特定の機能に絞り込んだ情報端末機器のことで、コンビニのチケット発券機や、家電量販店の写真プリント機、回転寿司屋さんなどのタッチパネルなど操作できるものもあれば、単に情報を流すだけの機能に特化したものもあります。

キオスク端末化の手順

それでは、肝となるホームアプリの作り方を順に説明していきます。

アプリをDeviceOwnerに指定できるようにする

ユーザの操作無しでアプリから他アプリの無効化などを制御するためには、DeviceOwner権限が必要になります。 DeviceOwner権限をアプリに指定するためには、アプリ内にDeviceAdminReceiverが必要になります。

下記のようにandroid.app.admin.DeviceAdminReceiverを継承して作成します。 DeviceOwner権限をアプリに指定できるようにするだけなら、onEnabledなどで特に処理をする必要はありません。

AndroidManifest.xmlにも忘れずにreceiverを追加しておきます。

不要なアプリの無効化

DeviceOwner権限がある状態で下記のコードが実行されると、指定したアプリを無効化できます。 無効化したアプリは、他のアプリから呼び出されても起動しなくなくなります。 また、最近使用したアプリの履歴からも消えます。

PackageManagerから端末内のアプリのパッケージ名一覧を取得して、自身のアプリ以外はすべて無効化します。 今回は適当にActivityのonCreateなどで実行しておき。

クイック設定パネルの無効化

DeviceOwner権限がある状態で下記のコードを実行されると、クイック設定パネルを無効化できます。 クイック設定パネルを無効化することで、クイック設定パネルからの設定変更をできないようにします。

こちらも適当にActivityのonCreateなどで実行しておきます。

自身をホームアプリとして登録

DeviceOwner権限がある状態で下記のコードを実行することで、自身をホームアプリとして登録します。 ホームアプリとして登録することで、常にこのアプリが起動するようになります。 端末を再起動しても、このアプリが最初に起動します。

アプリをDirectBoot対応にする

Android7.0以上で設定アプリを無効化すると端末が起動できなくなるため、DirectBootを有効にします。

Android7.0以上では、DirectBootMode対応していないホームアプリは、設定アプリのcom.android.settings/.FallbackHome経由で起動されるようになっており、設定アプリを無効化した状態では端末の起動に失敗します。 DirectBootMode対応することで直接ホームアプリが起動できるため、設定アプリを無効化しても端末の起動ができるようになります。

AndroidManifest.xmlのActivityにdirectBootAwareの設定を追加します。

ホームアプリの起動時に3rd Partyアプリを起動する

ホームアプリとして登録したActivityのonResumeで3rd Partyのアプリを起動するようにします。 今回はGoogleMapを起動するようにします。

ホームアプリとして登録したActivityのonResumeで3rd Partyのアプリを起動するようにします。 今回はGoogleMapを起動するようにします。

端末にホームアプリをインストール

Android Studioなどから端末に作成したホームアプリをインストールします。

Device Ownerを有効にする

下記のDeviceAdminReceiverを指定して、DeviceOwnerの権限を与えるには、

このようなコマンドを実行します。

DeviceOwnerの権限が付与できると下記のような表示になります。

Googleアカウントが設定されていたり、deviceOwnerに指定するDeviceAdminReceiverの指定を間違えていたりすると下記のように失敗します。 その場合は、端末を一旦初期化するなどして、できる限り端末を設定していない状態でやるとうまくはずです。

完成

以上で、GoogleMapしか起動できない端末の出来上がりです。

試しに再起動してもGoogleMapしか起動しません。
ステータスバーや他のアプリも無効になっているため設定画面を開いて設定を変えることもできません。

ただし、ホームボタンなどを押すとホームアプリのActivityが少し見えてしまいます。
これは適当に背景色を真っ黒にでもしたlayoutにしておけば、ユーザには気づかれないようにできるでしょう。

まとめ

今回は3rd Partyのアプリでキオスク端末化する方法をまとめてみました。
なかなかこういう要件は無いかもしれませんが、お役に立てれば幸いです。

あわせて読みたい記事