このStackOverflowの質問では、Android L開発者プレビューで、デバイス所有者アプリ、つまりキオスクモードを有効にする方法について説明します。この方法では、Androidのユーザーデバッグビルド、デバイスのルート化、およびXMLファイルのルートファイルシステムへのコピーが必要であるため、企業内での単一機能Androidデバイスの大量展開には適していません。
デバイス所有者のアプリは、実稼働のAndroid Lデバイスにどのようにインストールされますか?
このStackOverflowの質問では、Android L開発者プレビューで、デバイス所有者アプリ、つまりキオスクモードを有効にする方法について説明します。この方法では、Androidのユーザーデバッグビルド、デバイスのルート化、およびXMLファイルのルートファイルシステムへのコピーが必要であるため、企業内での単一機能Androidデバイスの大量展開には適していません。
デバイス所有者のアプリは、実稼働のAndroid Lデバイスにどのようにインストールされますか?
回答:
(編集:いくつかのテスト後に更新)
最新のドキュメントを確認してください。
この機能は、現在スクリーン固定と呼ばれているようで、アプリはデバイスの所有者である必要はありません。デバイスの所有者が設定されていない場合、ユーザーは同意するように求められます。ただし、以下で説明するように、キオスクでの使用にはこれに関する問題があります。
画面の固定を有効にするには、2つの方法があります。
手動:ユーザーは[設定]> [セキュリティ]> [画面のピン留め]で画面のピン留めを有効にし、最近の画面で緑色のピンアイコンをタッチして、ピン留めするタスクを選択できます。プログラムで:画面のピン留めをプログラムでアクティブにするには、アプリからstartLockTask()を呼び出します。要求元のアプリがデバイスの所有者ではない場合、ユーザーは確認を求められます。デバイス所有者のアプリは、setLockTaskPackages()メソッドを呼び出して、ユーザーの確認手順なしでアプリを固定できるようにすることができます。
画面のピン留めをプログラムで(デバイス所有者以外のアプリ)または最近のピンを使用してデバイスで有効にすると、次の動作が得られます。
画面の固定を有効にするかどうか、および終了するためにパスワードを要求するかどうかを尋ねるダイアログが表示されます。[はい]を押すと、ステータスバーと通知が消え、戻る、ホーム、最近のボタンは消えません。自宅や最近の人をタップすると、トーストが表示され、ユーザーに画面の固定を終了する方法が通知されます。
ユーザーは、画面のピン留めを終了するために、最近押したままにすることができます。ユーザーがパスワードを要求することを選択した場合、ユーザーはロック画面にまっすぐに蹴られます。この動作は、キオスクimoには適していないことを意味します。キオスクユーザーがロック画面を見ることは簡単すぎるためです。
適切なキオスクモードを取得するには、デバイスの所有者を設定する必要があります。Googleのドキュメントには、NFCでこれを行う必要があると書かれています。
デバイス所有者を展開してアクティブにするには、デバイスがプロビジョニングされていない状態のときに、プログラミングアプリからデバイスへのNFCデータ転送を実行する必要があります。
NFCを使用してこれを行うには少し複雑に見えます(デバイスにNFCがない場合はどうなりますか?)。私はまだこれを調査していませんので、NFCでデバイスの所有者を設定する方法について誰かが情報を提供できるのですか?これがあなたの質問の主なポイントになります。(つまり、ルート化されていないデバイスでデバイス所有者を設定する)
ただし、デバイスをルート化する場合の動作が期待どおりであることを確認するには、ここで説明したように、Googleの以前の手順(device_owner.xmlを追加)に従ってデバイス所有者を設定できます
これで、アプリを適切にロックできます。ユーザーが受け入れるダイアログは表示されません。有効にすると、最近ボタンとホームボタンが消え、アプリがロック解除されない限り、ユーザーはアプリを終了できません。適切なキオスクモード。最新のLollipopビルドを使用してNexus 7 2013でこれをテストしました。
次のスニペットはロックをオンにします。
mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
mDeviceAdminSample = new ComponentName(this, DeviceAdminSample.class);
if (mDPM.isDeviceOwnerApp(this.getPackageName())) {
Log.d(TAG, "isDeviceOwnerApp: YES");
String[] packages = {this.getPackageName()};
mDPM.setLockTaskPackages(mDeviceAdminSample, packages);
} else {
Log.d(TAG, "isDeviceOwnerApp: NO");
}
if (mDPM.isLockTaskPermitted(this.getPackageName())) {
Log.d(TAG, "isLockTaskPermitted: ALLOWED");
startLockTask();
} else {
Log.d(TAG, "isLockTaskPermitted: NOT ALLOWED");
}