安卓展示模式 - 允许退出

9
我正在编写一个用于自助模式的Android应用程序。我正在使用这个教程来创建自助模式:http://www.andreas-schrade.de/2015/02/16/android-tutorial-how-to-create-a-kiosk-mode-in-android/ 然而,在这个教程中,用户仍然可以在2秒后单击主页,然后返回应用程序。
因此,我做了一些修改来禁用主页按钮,方法是将我的应用程序作为主页。我通过在清单中添加以下内容来实现它:
<activity android:name=".MainActivity"
          android:launchMode="singleInstance">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.HOME"/>
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

一切工作正常。但是当用户尝试退出时(即用户以管理员身份登录),我的应用程序又回来了。我怀疑这是因为我将其设置为HOME。

我的问题是,如何允许我的应用程序退出。如果不能够回到实际的主页,有没有更好的方法解决这个主页问题(例如禁用主页按钮而不实际设置它为主页)?


在Android中有一个“真正的”Kiosk模式,您可以作为设备所有者触发它。这是一个非常重要的话题,如果您感兴趣,可以在此处阅读更多信息:https://developer.android.com/work/cosu.html - David Medenjak
2个回答

11

您安装了多个主屏幕(设备制造商提供的默认主屏幕和您的应用程序)。用户必须选择您的应用程序作为默认主屏幕(这通常发生在启动时)。现在,您想要做的是删除此“首选”设置,以便用户可以选择其他“默认”主屏幕(即制造商的应用程序)。请按照以下方式操作:

PackageManager pm = getPackageManager();
pm.clearPackagePreferredActivities ("your.package.name");

然后执行finish()来结束你的MainActivity


编辑:另一种解决方案

作为另一种解决方案,当您想要“退出”您的应用程序时,只需启动默认的主屏幕即可。要做到这一点,您需要知道默认主屏幕的包和类名称并进行硬编码,或者您可以像这样使用PackageManager扫描该信息:

PackageManager pm = getPackageManager();
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory(Intent.CATEGORY_HOME);
List<ResolveInfo> infoList = pm.queryIntentActivities(homeIntent, PackageManager.MATCH_DEFAULT_ONLY);
// Scan the list to find the first match that isn't my own app
for (ResolveInfo info : infoList) {
    if (!"my.package.name".equals(info.activityInfo.packageName)) {
        // This is the first match that isn't my package, so copy the
        //  package and class names into to the HOME Intent
        homeIntent.setClassName(info.activityInfo.packageName,
                       info.activityInfo.name);
        break;
    }
}
// Launch the default HOME screen
startActivity(homeIntent);
finish();

在这种情况下,您的应用仍然被设置为默认的HOME屏幕,因此如果用户再次按下HOME键,您的应用将会启动。但是用户可以“退出”您的应用程序,以返回到原始的HOME屏幕。

这正是我正在寻找的!但有一个问题(可能很容易解决),如何将我的应用程序设置为下一次启动的主页?因为当我执行 pm.clearPackagePreferredActivities 时,我的应用程序不再是主页,用户现在可以使用“主页”按钮。我仍然需要防止用户点击“主页”按钮(即当用户按下它时,“主页”按钮不起作用)。 - Sam
我想你需要告诉用户重新启动。在启动时,应该要求用户选择一个主屏幕。 - David Wasser
我已经添加了一个备选方案,你可以尝试一下。也许这更符合你的要求。 - David Wasser

3
你可以使用在Android 5.0中引入的设备所有者功能来完全管理Android设备并将其用作信息亭。其中之一是,这使您可以通过点击主页按钮来防止用户退出应用程序。
设置设备所有者信息亭的最简单方法是使用Android Management API并配置信息亭策略

嗨,弗雷德,我遇到的问题是无法关闭或退出当前应用程序。我需要启用“管理员”权限才能从应用程序中关闭(或退出)。这种关闭(或退出应用程序)只能由“管理员”使用,他们将通过我的应用程序登录。 - Sam
如果您使用Android管理API,您可以更改策略以在管理员登录您的应用程序时禁用展示模式,从而允许退出应用程序,然后再次更改策略以在管理员完成操作后重新启用展示模式。 - Fred
嗨,弗雷德,我认为在我的情况下这是不切实际的。基本上我们的应用程序是在仓库中使用的。在一天结束时,工作在管理部门的女士将收集所有平板电脑并使用她的条形码标签登录。然后她会得到一堆菜单按钮,其中之一是“退出”按钮。我一直在寻找如何以编程方式更改策略,但没有成功。因此,除非我可以以编程方式更改策略,否则我无法使用Android Management API :( - Sam
您可以使用devices.patch方法以编程方式更改策略,您可以使用具有访问您的云项目权限的任何服务帐户调用该方法(请参见创建服务帐户)。当管理员在平板电脑上登录时,您可以调用devices.patch来设置“非kiosk”策略,这将立即退出kiosk模式。如果需要,您还可以远程同时解锁多个平板电脑。 - Fred
Android管理API是基于云的API,因此需要互联网连接才能更改策略。我认为没有关闭功能,只有擦除和锁定功能。 - Fred
显示剩余4条评论

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