キオスクモードでAndroidアプリを実行し、セーフモードを無効にして、デバイスがハードリセットされないようにする方法は?
アプリには次の3つの要件があります。
デバイスの通常モードで、特定のアプリのみを学校の生徒に表示します。これは、デフォルトのランチャーを無効にし、 キオスクランチャー を有効にすることで可能になります。
システムアプリや組み込みアプリ(YouTube、ビデオプレーヤー、音楽アプリなど)の使用を避けるために、パスワードを無効にするか、セーフモードに設定してください。
デバイスのハードキー(電源ボタン、音量ボタン)の長押しを無効にして、デバイスのハードリセットを制限します。
私はこれらの要件を解釈し、以下の詳細な理解を思いつきました。
学校の生徒用アプリを再設計して、キオスクモードで実行されるランチャーアプリにすることができます。つまり、他の(試用版)ランチャーアプリは必要ありません。
AppLock アプリまたは同様の他のアプリを介して、システムまたはサードパーティアプリへのセーフモードアクセスを無効にすることができます。 Android Marshmallow 6.0までしか機能しません。ただし、Androidの制限があり、Nougat/Oreoデバイスでは機能しません。または、デバイスがセーフモードにならないようにするために電源ボタンのキー押下を処理しようとしましたが、Androidは、アプリからの電源キーの押下へのアクセスまたはリッスンを許可していません このリンク およびその他のさまざまな。
Android 7.0(NOUGAT)および8.0(OREO)ここにリンク に関する重要な注意事項
MMGuardian App に従い、現時点では、Android 7.0または8.0で実行されている電話に対してセーフモードロックを有効にすることはできません。セーフモードロックが適用されていた古い電話の場合以前に有効になっていたAndroidのこれらのバージョンに更新されると、セーフモードロック機能が無効になります。
誰かが私がこの状況をより詳細に理解するためにそれにもっと考えを加えるのを手伝ってもらえますか?
私は正しい方向に進んでいますか?または私はそれを正しく詳述しましたか?
Android Management API を見てください。カスタムデバイスのファームウェアがないと、これ以上のことはできないようです。
100%キオスクモードは不可能です。
ハードリセットを制限する:ハードリセットオプションはブートローダーの一部であるため、デバイスが出荷時設定にリセットされるのを防ぐのは困難です。
解決策はありましたが、デバイスがルート化されている場合にのみ機能します
ハードリセットを制限します:デバイスが復元されたときにapkファイルをsystem/appにコピーしますAndroidは自動的に再インストールしますsystem/appフォルダーのすべてのアプリ
システムアプリを無効にする:システムアプリまたは任意のアプリを無効にするには、シェルコマンドを実行します
pm disable <package name>
ボリュームキーの解釈:これを実行するには、ルートアクセスは必要ありません。アクティビティクラスでこのコードを使用してください
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
// TODO Auto-generated method stub
if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN))
{
// Do what ever you want
}
if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP))
{
// Do what ever you want
}
return true;
}
ボーナス無効ナビゲーションバーとステータスバー
隠れる
private void hideNavigationBar(){
try {
Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
os.writeBytes("pm disable com.Android.systemui\n");
os.flush();
try {
Process process = null;
process = Runtime.getRuntime().exec("su");
DataOutputStream osReboot = new DataOutputStream(process.getOutputStream());
osReboot.writeBytes("reboot\n");
osReboot.flush();
process.waitFor();
}
catch (IOException e) {
e.printStackTrace();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}catch (IOException e) {
e.printStackTrace();
}
}
通常に戻す
private void showNavigationBar(){
try {
Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
os.writeBytes("pm enable com.Android.systemui\n");
os.flush();
os.writeBytes("reboot\n");
os.flush();
process.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
注:シェルコマンドを実行すると、デバイスが再起動します
あなたはrootで遊んでいるので、あなたとあなた自身です。疑問がある場合は、コーディングを開始する前にコマンドを実行してください。
アプリを DeviceOwner として設計してデプロイできますか?これにより、デバイスで最大の可能性が得られますが、コンテキストによっては展開が困難になる可能性があります。公開リリースには適していませんが、デバイスのフリートを管理できれば実行可能です。