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

11
如何在Kiosk模式下运行Android应用程序,保持安全模式禁用并防止设备进行硬重置?
我对我的应用程序有以下3个要求:
1. 在设备的普通模式下仅显示特定应用程序。这可以通过禁用默认启动器并启用kiosk launcher来实现。
2. 禁用或设置安全模式密码以避免使用系统应用程序或内置应用程序(YouTube、视频播放器、音乐应用程序等)。
3. 通过禁用设备的硬按键长按(电源按钮、音量按钮)来限制设备的硬重置。
我已经解释了这些要求,并得出了以下详细理解。
  1. 我们可以重新设计学生校园应用程序,使其成为一个运行在kiosk模式下的启动器应用程序。这意味着我们将不需要任何其他(试用版)启动器应用程序。

  2. 我们可以通过AppLock 应用程序或类似的其他应用程序禁用系统或第三方应用程序的安全模式访问。它只适用于Android Marshmallow 6.0及以下版本。但是有一个由Android强制实施的限制-它不适用于Nougat / Oreo设备。或者,我们尝试处理电源按钮键按下事件,以防止设备进入安全模式。但是,根据this link和其他各种链接,Android不允许从我们的应用程序访问或监听电源键按下事件。

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

有人能帮我添加更多想法,让我更加了解这种情况吗?

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


1
要求#2和#3是设备的要求,而不是应用程序的要求。 - CommonsWare
我建议不要开发设备锁定解决方案,因为它本身就是一个产品,购买现有的解决方案更便宜。在我的情况下,一些客户使用https://www.42gears.com/products/surelock/surelock-android/来启用展示模式,他们声称也支持Oreo。此外,他们还会为设备包裹保护外壳。 - Ivar
3个回答

5

100%的自助模式不可能。

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

我有解决方案,但只适用于已经root过的设备。

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

禁用系统应用程序:要禁用系统应用程序或任何应用程序,请运行一个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打交道,所以你必须对自己负责。如果有任何疑问,请在开始编码之前询问。

你好,它说“变量process在作用域中已经定义”。 - Ferchi
在hideNavigationBar()方法中,因为有两个同名变量:process和os。 - Ferchi

4
看一下Android管理API,似乎没有自定义设备固件就做不到更多了。

2

您能将您的应用程序设计并部署为DeviceOwner吗?这样可以获得设备上的最大可能性,但根据情况部署可能会很困难:不适合公开发布,但如果您可以管理设备群,则可行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接