Android中的Kiosk模式

时间:2010-01-14 22:40:13

标签: android kiosk kiosk-mode

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

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

11 个答案:

答案 0 :(得分:26)

您可以通过收听BroadcastReceiver中的android.intent.action.BOOT_COMPLETED意图并从那里启动您的活动,在启动时自动启动应用程序。在活动中,您可以将自己注册为新的默认主屏幕[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>

答案 1 :(得分:17)

您可以自定义此功能(禁用对菜单的访问,限制应用程序添加等)以启用自助服务终端。 http://code.google.com/p/android-launcher-plus/

答案 2 :(得分:17)

在新的Android L预览版中,Google宣布了Task Locking,就是这样做的。但它似乎确实需要root。

  

L Developer Preview引入了一个新的任务锁定API   您暂时限制用户离开您的应用或存在   被通知中断。例如,如果您可以使用此功能   正在开发一个教育应用程序,以支持高风险评估   Android上的要求。一旦您的应用激活此模式,用户就会   无法看到通知,访问其他应用或返回   主屏幕,直到您的应用退出模式。

     

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

     

要设置设备所有者,请按以下步骤操作:

     
      
  • 将运行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.isLockTaskPermitted()。

     

要激活任务锁定,请致电android.app.Activity.startLockTask()   来自您的授权活动。

     

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

     
      
  • 状态栏为空白,以及用户通知和状态信息   是隐藏的。
  •   
  • 隐藏了主页和最近的应用程序按钮。
  •   
  • 其他应用可能会   不开展新活动。
  •   
  • 当前的应用可能会开始新的活动,   只要这样做不会创建新任务。
  •   
  • 用户保持锁定状态   在您的应用上,直到授权活动呼叫   Activity.stopLockTask()
  •   

答案 3 :(得分:9)

在搜索了一段时间后,我想出了一个很好的解决方案。这只适用于root设备,但我想如果只是这个应用程序,那么生根应该不是问题。

另请查看http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/

答案 4 :(得分:3)

Android开发人员的

Set up Single-Purpose Devices Page描述了这些事情,你可以从那里轻松了解更多信息。

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

答案 5 :(得分:3)

Google最近发布了Android Management API,可以为运行Android 5.1或更高版本的任何Android设备轻松设置信息亭模式,还可以设置其他各种政策。

答案 6 :(得分:2)

在此forum post中找到了另一种可能的技巧。引用该帖子:

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

  

使用以下方法可以构建一个应用程序   防止“常规”用户玩你的其他任何东西   应用

     

该应用程序由两个模块组成。主要活动和一个   服务。该服务配置为在引导时启动。什么时候服务   启动它会检查活动是否正在运行。如果不是   运行它使用计时器来启动主要活动。

     

当活动暂停时,它会安排服务以一个开始   第二:代码:

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

如果用户按下主屏幕,则会出现主屏幕   几秒钟。但是,您的应用程序将返回到前端   几秒钟后,用户将无法与任何人进行交互   其他应用程序或更改设置。

     

该服务被设置为前台服务。这可以防止Android   从杀死我们的服务。按“停止”按钮可停用自助服务终端   模式。

似乎也有example kiosk-mode code ZIP file available for download

答案 7 :(得分:2)

启动应用程序

实现此目的的最佳方法是将您的应用设置为启动器

<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>

锁定您的应用

最可靠的方法是使用Lollipop或更高版本的设备并使用

startLockTask

首先,您必须将应用设置为设备所有者。注意,您的设备必须取消设置:如果您已注册,则应重置出厂设置并跳过帐户注册。

为了能够注册您的应用,您必须首先设置DeviceAdminReceiver组件:

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启动以下命令(不需要root

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

要避免安卓系统要求用户授权您必须致电您的应用 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();
}

答案 8 :(得分:1)

Xposed框架可以做到这一点。它需要root,并且它有可能无法在所有平台上运行。在类 android.app.StatusBarManager 中查找 disable()方法。

Here in Android source code

在这里看看如何编写自己的模块: Xposed development tutorial

乍一看,这比你想象的容易得多。祝你好运!

答案 9 :(得分:0)

除了使用BOOT接收器设置应用程序,以及this answer以防止状态栏扩展外,此解决方案适用于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);
                        }
                    }
                });
    }

这将完全隐藏后退按钮,应用程序和主页按钮。

答案 10 :(得分:0)

信息亭模式只不过是在您打开Android设备时锁定单个或一组应用程序。这可以通过锁定任务模式来实现。当设备在锁定任务模式下运行时,用户通常看不到通知,访问未列入白名单的应用程序或返回主屏幕。

设备策略控制器(DPC)可以将系统处于锁定任务模式时可以运行的应用列入白名单。由于它是用于特定目的的专用设备,因此使用该设备的人无法退出锁定任务模式。 Android 5.0及更高版本的设备可以在锁定任务模式下运行。

    •        Whitelisting the applications

第一步是通过DPC将应用程序列入白名单。 DPC可以通过调用将可在锁定任务模式下使用的应用列入白名单

DevicePolicyManager.setLockTaskPackages()

    ▪         Start lock task mode

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

ActivityOptions.setLockTaskEnabled()

您可以在此处找到有关锁定任务模式的更多详细信息。 https://developer.android.com/work/dpc/dedicated-devices/lock-task-mode