【问题标题】:Android Kiosk Mode - Allow ExitAndroid Kiosk 模式 - 允许退出
【发布时间】:2018-02-16 05:18:58
【问题描述】:

我正在为信息亭模式编写 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 模式,您可以作为设备所有者触发。这是一个非常大的话题,如果您有兴趣,可以在这里阅读更多内容:developer.android.com/work/cosu.html

标签: android kiosk kiosk-mode


【解决方案1】:

您安装了多个主屏幕(设备制造商和您的应用提供的默认屏幕)。用户必须选择您的应用程序应该是默认的主屏幕(这通常发生在启动时)。您现在要做的是删除此“首选”设置,以便用户可以选择不同的“默认”主屏幕(即:制造商的应用程序)。这样做:

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 键,您的应用程序将被启动。但用户随后可以“退出”您的应用程序以再次返回原始主屏幕。

【讨论】:

  • 这正是我要找的!但是有一个问题(可能很容易解决),如何将我的应用程序设置为下次启动的主页?因为当我执行pm.clearPackagePreferredActivities 时,我的应用不再是主页,用户现在可以使用“主页”按钮。我仍然需要防止用户点击“主页”按钮(即“主页”按钮在用户按下时什么都不做)
  • 我想您需要告诉用户重新启动。在启动时,应要求用户选择主屏幕。
  • 我添加了一个可供您尝试的替代解决方案。也许这更符合您的要求。
【解决方案2】:

您可以使用 Android 5.0 中引入的设备所有者功能来全面管理 Android 设备并将其用作信息亭。除此之外,这还允许您防止用户通过点击主页按钮退出应用程序。

设置设备所有者信息亭的最简单方法是使用Android Management API 并配置kiosk policy

【讨论】:

  • 嗨 Fred,我遇到的问题是我无法关闭或退出当前应用程序。我需要启用“管理员”以从应用程序中关闭(或退出)。此关闭(或退出应用程序)必须仅适用于“管理员”,他们将通过我的应用程序登录。
  • 如果您使用 Android Management API,您可以更改策略以在管理员登录您的应用时禁用 kiosk 模式,允许退出应用,然后再次更改策略以重新启用 kiosk 模式一旦管理员完成。
  • 嗨 Fred,我认为这对我来说并不实用。因此,基本上我们的应用程序是在仓库中使用的。在一天结束时,在管理员工作的女士将收集所有平板电脑并使用她的条形码标签登录。然后她会得到一堆菜单按钮,其中一个是“退出”按钮。我一直在寻找如何以编程方式更改策略但没有成功。因此,除非我可以通过编程方式更改策略,否则我无法使用 Android Management API :(
  • 您可以使用devices.patch 方法以编程方式更改策略,您可以使用任何有权访问您的云项目的服务帐户调用该策略(请参阅Create a service account)。当管理员在平板电脑上登录时,您调用 devices.patch 来设置“非 kiosk”策略,该策略会立即退出 kiosk 模式。如果需要,您还可以一次远程解锁多台平板电脑。
  • 嗨 Fred,这真的很酷!!!谢谢!我会进行更多调查。只是一个简单的问题,那些仓库平板电脑将无法访问互联网。他们的WIFI是隔离的,只允许连接到后台服务器。有没有办法在没有互联网连接的情况下禁用/启用此策略?我被告知至少有一个仓库完全没有互联网连接:(
猜你喜欢
  • 2017-01-01
  • 1970-01-01
  • 2015-12-30
  • 2021-06-02
  • 2014-05-21
  • 2011-01-05
  • 2022-07-06
  • 2020-06-08
相关资源
最近更新 更多