我正在尝试在root设备上实现Kiosk应用,我需要完全禁用导航和状态栏。
这些命令适用于adb shell
禁用:
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");
在我的活动中按下按钮时。但没有任何反应,也没有例外。然后突然出现了一个吐司,说应用程序已获得超级用户权限。
有什么想法吗?
答案 0 :(得分:3)
要运行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");
如果您想启用
runCmd("pm enable com.android.systemui && am startservice -n com.android.systemui/.SystemUIService");
答案 1 :(得分:1)
使用Android 5和6,您可以尝试这个技巧:
settings put secure user_setup_complete 0
答案 2 :(得分:0)
拆分su调用和命令调用:
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);
}