【问题标题】:Kiosk mode in AndroidAndroid 中的 Kiosk 模式
【发布时间】:2011-01-05 07:13:56
【问题描述】:

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

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

【问题讨论】:

标签: android kiosk kiosk-mode


【解决方案1】:

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

我认为有些情况在不修改框架的情况下是无法处理的(比如长按 Home 以显示当前活动的应用程序)——不过我也可能弄错了。

但对于一个原型就足够了。

玩得开心!

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

【讨论】:

  • 您还需要覆盖第一个活动的onbackpressed,否则当您按下返回按钮进入启动器时
  • 如何通过代码实现系统对话框n通知栏禁用
  • @Rinkalkumar 以全屏模式运行应用程序。
【解决方案2】:

您可以对此进行自定义(禁用对菜单的访问、限制应用程序添加等)以启用信息亭。 http://code.google.com/p/android-launcher-plus/

【讨论】:

  • 我能知道为什么这被否决了吗?我通过在 android launcher plus 之上进行编辑和开发,编写了我目前已部署的完整 Android kiosk 应用程序。
  • 在这种情况下,我赞成你的回答和你的评论;-)
  • @rbot 你是怎么做到的?多年来,我一直在尝试构建一个信息亭应用程序,除了确保通知托盘没有打开之外,我几乎解决了所有其他问题。
  • @Wakka02 我想我正在寻找 onwindowchanged 或一些类似的事件(可能表明通知托盘打开)并关闭托盘。我很久以前做过,所以不记得具体细节了。
【解决方案3】:

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

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

为防止未经授权的使用,只有授权的应用才能激活任务 锁定。此外,任务锁定授权必须由 专门配置的设备所有者应用程序,通过 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()

【讨论】:

【解决方案4】:

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

另一种方式也可以查看http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/

【讨论】:

    【解决方案5】:

    在启动时启动您的应用

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

    <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
    

    为避免 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();
    }
    

    【讨论】:

      【解决方案6】:

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

      【讨论】:

      【解决方案7】:

      Set up Single-Purpose Devices Page 的android 开发者已经描述了这些东西,你可以从那里轻松了解更多的东西。

      现在可以轻松地将 Android 6.0 Marshmallow 及更高版本设备配置为公司拥有的一次性 (COSU) 设备。

      【讨论】:

        【解决方案8】:

        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
        

        如果用户按下主屏幕,主屏幕将出现 几秒钟。但是你的申请会回到前面 几秒钟后,用户将无法与任何 其他应用程序或更改设置。

        服务设置为前台服务。这可以防止安卓 从杀死我们的服务。按下停止按钮以停用信息亭 模式。

        似乎还有一个example kiosk-mode code ZIP file available for download

        【讨论】:

          【解决方案9】:

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

          Here in Android source code

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

          这比您乍一看要容易得多。祝你好运!

          【讨论】:

          • 您认为有任何 Xposed 模块可以做到这一点吗?
          【解决方案10】:

          除了使用 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);
                                  }
                              }
                          });
              }
          

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

          【讨论】:

          • 通知栏呢?
          【解决方案11】:

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

          设备策略控制器 (DPC) 可以将系统处于锁定任务模式时可以运行的应用列入白名单。由于它是用于特定目的的专用设备,因此使用该设备的人无法离开锁定任务模式。安卓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

          【讨论】:

            猜你喜欢
            • 2020-12-27
            • 2019-03-31
            • 2018-01-24
            • 2014-08-28
            • 1970-01-01
            • 2018-02-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多