Android 中的信息亭模式

我正在评估 CF 是否和如何。NET 企业应用程序可以移植到 Android 设备上运行。Windows Mobile 手机上的应用程序运行在信息亭模式下,应用程序在启动后以全屏模式自动启动,用户无法意外或自愿访问手机的任何其他部分。

在 Android 上是否可能只有一个应用程序在启动后自动启动,并防止用户意外(或自愿)访问 Android 设备的任何其他部分?

100050 次浏览

您可以在启动时通过侦听 BroadcastReceiver 中的 android.intent.action.BOOT_COMPLETED意图来自动启动应用程序,并从那里启动您的 Activity。在 Activity 中,您可以将自己注册为新的默认主屏幕[1]并处理密钥。

我认为有些实例不修改框架就无法处理(比如在 Home 上显示当前活动的应用程序的 longpress)——但我也可能搞错了。

但是对于一个原型来说,这已经足够了。

玩得开心!

[1]:

<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>

Found another possible technique in this 论坛帖子. Quoting that post:

http://www.basic4ppc.com/forum/basic4android-getting-started-tutorials/10839-android-kiosk-mode-tutorial.html

Using the following methods you can build an application that will 防止“常规”用户使用除您的 申请。

应用程序由两个模块组成 服务被配置为在启动时启动 它检查活动是否正在运行。如果没有运行 运行它使用一个计时器来启动主活动。

当活动暂停时,它安排服务在一个活动中启动 第二: 守则:

Sub Activity_Pause (UserClosed As Boolean)
If kiosk Then StartServiceAt(KioskService, DateTime.Now + 1 * DateTime.TicksPerSecond, false)
End Sub

如果用户按主屏幕,主屏幕将出现 然而,您的申请将返回到前面 几秒钟后,用户将不能与任何 其他应用程序或更改设置。

The service is set to be a foreground service. This prevents Android 停止我们的服务。按下停止按钮,关闭自助服务站 模式。

There appears to be an 示例 kiosk-mode 代码 ZIP 文件可供下载, too.

您可以自定义(禁用菜单访问,限制应用程序添加等) ,以启用 kiosk.http://code.google.com/p/android-launcher-plus/

经过一段时间的寻找,我想出了一个很好的解决方案。虽然这只适用于有根设备,但是我想如果只适用于这一个应用程序,那么有根应用程序应该不是问题。

还可以通过 http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/了解另一种方法

在最新的 Android L 预览版中,谷歌发布了 任务锁定,它确实做到了这一点。然而,它似乎确实需要根。

L Developer 预览版引入了一个新的任务锁定 API,它允许 你可以暂时限制用户离开你的应用程序 通知中断。例如,如果您 正在开发一个教育应用程序,以支持高风险评估 一旦你的应用程序激活了这个模式,用户就会 无法查看通知、访问其他应用程序或返回 主屏幕,直到你的应用程序退出模式。

为了防止未经授权的使用,只有经过授权的应用程序才能激活任务 此外,任务锁定授权必须由 专门配置的设备所有者应用程序,通过 android.app.admin.DevicePolicyManager.setLockTaskComponents() method.

To set up a device owner, follow these steps:

  • 将运行 Android userdebug构建的设备附加到开发中 机器。
  • 安装您的设备所有者应用程序。
  • 创建 device_owner.xml文件 并将其保存到设备上的 /data/system目录。
$ adb root
$ adb shell stop
$ rm /tmp/device_owner.xml
$ echo "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>" >> /tmp/device_owner.xml
$ echo "&device-owner package=\"<your_device_owner_package>\" name=\"*<your_organization_name>\" />" >> /tmp/device_owner.xml
$ adb push /tmp/device_owner.xml /data/system/device_owner.xml
$ adb reboot

在应用程序中使用任务锁定 API 之前,请验证您的 活动通过调用 DevicePolicyManager.isLockTaskPermit ().

要激活任务锁定,请调用 android.app.Activity.startLockTask() 从你的授权活动。

当任务锁定处于活动状态时,以下行为生效:

  • 状态栏是空白的,还有用户通知和状态信息 藏起来了。
  • 主页和最近的应用程序按钮是隐藏的。
  • 其他应用程序可以 not launch new activities.
  • 当前的应用程序可能会开始新的活动, 只要这样做不会产生新的任务。
  • 用户仍然被锁定 on your app until an authorized activity calls Activity.stopLockTask().

Xposed 框架 可以做到这一点。它需要 root,而且有可能不能在所有平台上工作。在类 应用程序,状态栏管理器中查找 ()方法。

这里是 Android 源代码

下面介绍如何编写自己的模块: Xposed 开发教程

这比你第一眼看到的要容易得多。祝你好运!

除了使用 BOOT 接收器设置应用程序,以及使用 这个答案防止状态栏扩展之外,这个解决方案还可以作为一个完整的信息亭应用程序在4.4及以上版本中使用:

将其放在 onCreate ()中:

    final View view = (View) findViewById(android.R.id.content);
if (view != null) {
//"hides" back, home and return button on screen.
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_IMMERSIVE |
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
View.SYSTEM_UI_FLAG_FULLSCREEN);
view.setOnSystemUiVisibilityChangeListener
(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
// Note that system bars will only be "visible" if none of the
// LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_IMMERSIVE |
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
View.SYSTEM_UI_FLAG_FULLSCREEN);
}
}
});
}

This will completely hide the back button, apps and home button.

启动你的应用程序

实现这一点的最佳方法是将应用程序设置为启动程序

<activity ...
android:launchMode="singleInstance"
android:windowActionBar="false">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

锁定你的应用程序

最可靠的方法是使用棒棒糖或更大的设备,并利用

startLockTask

first you must set your app as the device owner. NB your device must be unprovisioned: if you registered it you should do a factory reset and skip the account registration.

to be able to register your app you must first setup a DeviceAdminReceiver component:

package com.example.myapp;


public class MyDeviceAdminReceiver extends android.app.admin.DeviceAdminReceiver {
@Override
public void onEnabled(Context context, Intent intent) {
Toast.makeText(context, "Device admin permission received", Toast.LENGTH_SHORT).show();
}


@Override
public CharSequence onDisableRequested(Context context, Intent intent) {
return "are you sure?";
}


@Override
public void onDisabled(Context context, Intent intent) {
Toast.makeText(context, "Device admin permission revoked", Toast.LENGTH_SHORT).show();
}




@Override
public void onLockTaskModeExiting(Context context, Intent intent) {
// here you must re-lock your app. make your activity know of this event and make it call startLockTask again!
}
}

一旦你有了一个未配置的设备,你可以从 adb (不需要根)启动以下命令

adb shell dpm set-device-owner com.example.myapp/.MyDeviceAdminReceiver

为了避免 Android 请求用户权限来固定您必须调用的应用程序 SetLockTaskPackages

终于!

@Override
public void onResume(){
super.onResume();
DevicePolicyManager mDevicePolicyManager = (DevicePolicyManager) getSystemService(
Context.DEVICE_POLICY_SERVICE);
ComponentName mAdminComponentName = new ComponentName(getApplicationContext(), MyDeviceAdminReceiver.class);
mDevicePolicyManager.setLockTaskPackages(mAdminComponentName, new String[]{getPackageName()});
startLockTask();
}
@Override
public void finish(){
stopLockTask();
super.finish();
}

设置单用途设备安卓开发者页面 已经描述了这些事情,你可以很容易地从那里了解到更多的东西。

现在,很容易将 Android 6.0棉花糖和更高版本设备配置为公司拥有的一次性(COSU)设备。

谷歌最近发布了 Android 管理 API,它允许为任何运行安卓5.1或更高版本的安卓设备轻松设置信息亭模式,还可以设置各种其他政策。

Kiosk 模式只是在你打开机器人设备时锁定一个或一组应用程序。这可以通过锁任务模式来实现。当设备以锁任务模式运行时,用户通常无法看到通知、访问未列入白名单的应用程序或返回主屏幕。

设备策略控制器(DPC)可以列出当系统处于锁任务模式时可以运行的应用程序。由于它是一个专门用于特定目的的设备,因此使用该设备的人不能离开锁定任务模式。Android 5.0或更高版本的设备可以在锁任务模式下运行。

    •        Whitelisting the applications

第一步是通过 DPC 将应用程序列入白名单。 DPC 可以通过调用

SetLockTaskPackages ()

    ▪         Start lock task mode

一旦完成了白名单,DPC 就可以调用下面的函数来启动锁任务。

启用 ActivityOptions.setLockTaskEnable ()

您可以在这里找到关于锁任务模式的更多细节