11

如何在 Kiosk 模式下运行 Android 应用程序,保持禁用安全模式并防止设备硬重置?

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

  1. 在设备的正常模式下仅向学校学生显示特定的应用程序。这可以通过禁用默认启动器并启用信息亭启动器来实现。

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

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

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

  1. 我们可以重新设计学生应用程序,使其自身成为一个以信息亭模式运行的启动器应用程序。这意味着我们不需要任何其他(试用版)启动器应用程序。

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

ANDROID 7.0 (NOUGAT) 和 8.0 (OREO) 的重要提示-链接在这里

根据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

有人可以帮我添加更多想法,以便我更详细地了解这种情况吗?

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

4

3 回答 3

5

100% 信息亭模式是不可能的。

限制硬重置:硬重置选项是引导加载程序的一部分,因此很难防止设备恢复出厂设置,

我有解决方案,但只有在设备植根时才有效

限制硬重置:将您的 apk 文件复制到系统/应用程序,当设备恢复时,Android 将自动重新安装系统/应用程序文件夹中的所有应用程序禁用系统应用

程序:禁用系统应用程序或任何应用程序运行 shell 命令

pm disable <package name>


解释音量键:要运行它,您不需要 root 访问权限,请在您的 Activity 类中使​​用此代码

@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();
    }
}

注意:运行 shell 命令后设备将重新启动

你玩root,所以你和你自己,如果有任何疑问,请在开始编码之前命令

于 2018-01-31T08:04:47.847 回答
4

看看Android Management API,似乎没有自定义设备固件就无法完成。

于 2018-01-25T17:01:19.167 回答
2

您可以设计并部署您的应用程序作为DeviceOwner吗?这为您在设备上提供了最大的可能性,但根据具体情况,部署可能会很痛苦:不适合公开发布,但如果您可以管理设备队列,则可行。

于 2018-01-27T03:02:05.953 回答