如何在Kiosk模式下运行Android应用,禁用安全模式并阻止设备进行硬重置?

时间:2018-01-17 14:25:51

标签: android reset android-8.0-oreo kiosk-mode safe-mode

如何在Kiosk模式下运行Android应用,禁用安全模式并阻止设备进行硬重置?

我对我的应用有以下3个要求:

  1. 在设备的正常模式下,仅向学生展示特定应用。这可以通过禁用默认启动器并启用kiosk launcher

  2. 来实现
  3. 禁用或将密码设置为安全模式,以避免使用系统应用程序或内置应用程序(youtube,视频播放器,音乐应用等)。

  4. 通过禁用长按设备的硬键(电源按钮,音量按钮)来限制设备的硬重置。

  5. 我已经解释了这些要求,并提出了以下详细的理解。

    1. 我们可以重新设计学生应用程序,使自己成为一个将在自助服务终端模式下运行的启动器应用程序。这意味着我们不会要求任何其他(试用版)启动器应用程序。

    2. 我们可以通过AppLock应用或类似的其他应用禁用对系统或第三方应用的安全模式访问。它仅适用于Android Marshmallow 6.0。但是有一个Android限制 - 它不适用于Nougat / Oreo设备。或者,我们尝试按下电源按钮按键以防止设备进入安全模式。但Android不支持按this link及其他各种方式从我们的应用程序访问或收听电源按键。

    3. ANDROID 7.0(NOUGAT)和8.0(OREO)的重要提示 - link here

      根据MMGuardian App,目前无法为在Android 7.0或8.0上运行的手机启用安全模式锁定。如果以前启用安全模式锁定的旧手机更新为这些Android版本,安全模式锁定功能将被禁用。

      1. 我们无法阻止任何设备进行硬重置,因为它主要是在手机关机后完成,让应用程序无法控制。但是有一个昂贵的选择。我们可以使用COSU设备并设计自定义固件。有关COSU的更多详细信息,请访问以下链接。 https://developer.android.com/work/cosu.html https://developers.google.com/android/work/requirements/cosu
      2. 有人可以帮助我添加更多想法让我更详细地了解这种情况吗?

        我是朝着正确的方向前进的吗?或者我是否正确详细说明了?

3 个答案:

答案 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吗?这为您提供了设备上最大的可能性,但根据上下文部署可能很痛苦:不适合公开发布,但如果您可以管理设备组,则可行。