如何在Kiosk模式下运行Android应用,禁用安全模式并阻止设备进行硬重置?
我对我的应用有以下3个要求:
在设备的正常模式下,仅向学生展示特定应用。这可以通过禁用默认启动器并启用kiosk launcher。
禁用或将密码设置为安全模式,以避免使用系统应用程序或内置应用程序(youtube,视频播放器,音乐应用等)。
通过禁用长按设备的硬键(电源按钮,音量按钮)来限制设备的硬重置。
我已经解释了这些要求,并提出了以下详细的理解。
我们可以重新设计学生应用程序,使自己成为一个将在自助服务终端模式下运行的启动器应用程序。这意味着我们不会要求任何其他(试用版)启动器应用程序。
我们可以通过AppLock应用或类似的其他应用禁用对系统或第三方应用的安全模式访问。它仅适用于Android Marshmallow 6.0。但是有一个Android限制 - 它不适用于Nougat / Oreo设备。或者,我们尝试按下电源按钮按键以防止设备进入安全模式。但Android不支持按this link及其他各种方式从我们的应用程序访问或收听电源按键。
ANDROID 7.0(NOUGAT)和8.0(OREO)的重要提示 - link here
根据MMGuardian App,目前无法为在Android 7.0或8.0上运行的手机启用安全模式锁定。如果以前启用安全模式锁定的旧手机更新为这些Android版本,安全模式锁定功能将被禁用。
有人可以帮助我添加更多想法让我更详细地了解这种情况吗?
我是朝着正确的方向前进的吗?或者我是否正确详细说明了?
答案 0 :(得分:4)
看看Android Management API,如果没有自定义设备固件,似乎无法完成。
答案 1 :(得分:4)
100%Kiosk模式无法实现。
限制硬重置:硬重置选项是引导加载程序的一部分,因此很难阻止设备恢复出厂设置,
我有解决方案,但只有在设备生根的情况下才有效
限制硬重置:将您的apk文件复制到 system / app ,当设备恢复时,Android会自动从 system / app 文件夹
禁用系统APP:以禁用系统应用程序或任何运行shell命令的应用程序
pm disable <package name>
解释音量键:要运行此功能,您不需要root访问权限,请在活动类中使用此代码
@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 os = new DataOutputStream(process.getOutputStream());
os.writeBytes("reboot\n");
os.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();
}
}
注意:设备将在运行shell命令后重新启动
你玩root,所以你和你自己,如果有任何疑问,请在开始编码之前指挥
答案 2 :(得分:2)
您可以将应用设计为DeviceOwner吗?这为您提供了设备上最大的可能性,但根据上下文部署可能很痛苦:不适合公开发布,但如果您可以管理设备组,则可行。