Я пытаюсь реализовать приложение Kiosk на корневом устройстве Android, и мне нужно полностью отключить навигацию и строку состояния.
Эти команды работают с оболочкой adb
Отключить:
service call activity 42 s16 com.android.systemui
Включить:
am startservice -n com.android.systemui/.SystemUIService
Это хорошо! Теперь мне нужно сделать это из своего приложения. Поэтому для отключения я пробовал:
Process process = Runtime.getRuntime().exec("su service call activity 42 s16 com.android.systemui");
при нажатии кнопки в моей активности. Но ничего не происходит, и никаких исключений не возникает. Тост всплывает, хотя, говоря, что для приложения были предоставлены права суперпользователя.
Любые идеи?
Для запуска su cmd вы можете использовать этот
public static void runCmd(String cmd) {
DataOutputStream os;
try {
Process process = Runtime.getRuntime().exec("su");
os = new DataOutputStream(process.getOutputStream());
os.writeBytes(cmd + "\n");
os.writeBytes("exit\n");
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Чтобы отключить систему ui, вы можете запустить эту команду
runCmd("pm disable com.android.systemui && service call activity 42 s16 com.android.systemui");
Если вы хотите включить back
runCmd("pm enable com.android.systemui && am startservice -n com.android.systemui/.SystemUIService");
С Android 5 и более вы можете попробовать этот трюк:
settings put secure user_setup_complete 0
Разделить вызов и вызов команды:
try{
Process su = Runtime.getRuntime().exec("su");
DataOutputStream outputStream = new DataOutputStream(su.getOutputStream());
outputStream.writeBytes("service call activity 42 s16 com.android.systemui");
outputStream.flush();
outputStream.writeBytes("exit\n");
outputStream.flush();
su.waitFor();
}catch(IOException e){
throw new Exception(e);
}catch(InterruptedException e){
throw new Exception(e);
}