Android Kiosk 模式 - 允许退出
Android Kiosk Mode - Allow Exit
我正在编写 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 5.0 中引入的设备所有者功能来完全管理 Android 设备并将其用作信息亭。除其他外,这允许您防止用户通过点击主页按钮退出应用程序。
设置设备所有者信息亭的最简单方法是使用 Android Management API and configure a kiosk policy。
您安装了多个主屏幕(设备制造商和您的应用提供的默认屏幕)。用户必须选择您的应用程序应该是默认的主屏幕(这通常发生在启动时)。您现在要做的是删除此 "preferred" 设置,以便用户可以选择不同的 "default" HOME 屏幕(即:制造商的应用程序)。这样做:
PackageManager pm = getPackageManager();
pm.clearPackagePreferredActivities ("your.package.name");
然后 finish()
你的 MainActivity
。
编辑:替代解决方案
作为替代解决方案,当您想要 "exit" 您的应用程序时,您只需启动默认主屏幕即可。为此,您需要知道默认主屏幕的包和 class 名称并对其进行硬编码,或者您可以使用 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();
在这种情况下,您的应用仍被设置为默认主屏幕,因此如果用户再次按下主屏幕键,您的应用将启动。但是用户可以 "exit" 您的应用程序再次 return 到原始主屏幕。
我正在编写 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 5.0 中引入的设备所有者功能来完全管理 Android 设备并将其用作信息亭。除其他外,这允许您防止用户通过点击主页按钮退出应用程序。
设置设备所有者信息亭的最简单方法是使用 Android Management API and configure a kiosk policy。
您安装了多个主屏幕(设备制造商和您的应用提供的默认屏幕)。用户必须选择您的应用程序应该是默认的主屏幕(这通常发生在启动时)。您现在要做的是删除此 "preferred" 设置,以便用户可以选择不同的 "default" HOME 屏幕(即:制造商的应用程序)。这样做:
PackageManager pm = getPackageManager();
pm.clearPackagePreferredActivities ("your.package.name");
然后 finish()
你的 MainActivity
。
编辑:替代解决方案
作为替代解决方案,当您想要 "exit" 您的应用程序时,您只需启动默认主屏幕即可。为此,您需要知道默认主屏幕的包和 class 名称并对其进行硬编码,或者您可以使用 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();
在这种情况下,您的应用仍被设置为默认主屏幕,因此如果用户再次按下主屏幕键,您的应用将启动。但是用户可以 "exit" 您的应用程序再次 return 到原始主屏幕。