65.9K
CodeProject 正在变化。 阅读更多。
Home

开发iosk应用程序

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2018年7月20日

CPOL

4分钟阅读

viewsIcon

22969

将 Android 应用变成 kiosk 应用

在本文中,我将展示如何将您的 Android 应用程序变成 Kiosk 应用程序。

引用

Kiosk 应用程序是一种特殊类型的应用程序,旨在始终全屏运行,并且不允许用户退出该应用程序。

为了实现这一点,我们需要将我们的应用程序设置为设备所有者。

我为什么需要这个?

Kiosk 应用程序的主要特点是用户无法退出您的应用程序 – 设备被锁定只能使用您的应用程序。此功能从 Android 5.0 开始原生存在,被称为锁定任务模式:使用锁定任务模式,用户无法退出应用程序,并且“主页”和“最近”按钮被隐藏。但只有由 DPC(设备策略控制器)列入白名单的应用程序才能被锁定。

虽然您可以使用第三方企业移动管理 (EMM) 解决方案来启用锁定任务模式(并做其他花哨的事情),但这对于您只需要一个单用途设备的情况来说可能有点过分 – 您要么需要向 EMM 提供商付费,要么自己成为 EMM 提供商(这并非易事)。

我需要什么?

为了开发目的,任何 Android >= 5.0 的设备都可以,设备所有者模式可以使用 `adb` 命令设置。但是,为了在现实生活中配置设备,您需要一个干净(或恢复出厂设置)的 Android >= 7.0 的设备(实际上 5.0-6.0 可以进入设备所有者模式,但只能使用 NFC – 所以您需要 2 个支持 NFC 的设备,其中一个应该使用 NFC 程序员应用程序,该应用程序需要单独编写。在本文中,我们将讨论使用 QR 码的更简单的方法,但它仅从 Android 7.0 开始支持 – 好消息是,对于企业开发来说,您可以控制将使用哪些设备)。

您还需要注册管理员接收器:当应用程序进入设备所有者模式时,它将收到通知。它可以像这样简单

package com.example.ookami.myapplication

import android.app.admin.DeviceAdminReceiver
import android.app.admin.DevicePolicyManager
import android.content.ComponentName
import android.content.Context
import android.content.Intent

class AdminReceiver : DeviceAdminReceiver() {
    override fun onEnabled(context: Context, intent: Intent?) {
        super.onEnabled(context, intent)
        val manager = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
        val component = ComponentName(context.applicationContext, AdminReceiver::class.java)
        manager.setLockTaskPackages(component, arrayOf(context.packageName))
    }
}

在本代码中,我们授予我们的应用程序进入锁定任务模式的权限。

AndroidManifest 中注册此接收器

<receiver
        android:name=".AdminReceiver"
        android:permission="android.permission.BIND_DEVICE_ADMIN">
    <meta-data
            android:name="android.app.device_admin"
            android:resource="@xml/device_admin"/>
    <intent-filter>
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
    </intent-filter>
</receiver>

并将文件 device_admin.xml 添加到 res/xml 中,内容如下

<device-admin>
</device-admin>

现在,如果我们只是在 AndroidManifest 中的每个活动中添加 android:lockTaskMode="if_whitelisted",它们将自动在锁定任务模式下启动。

我如何测试它?

所以让我们从在开发模式下配置应用程序开始。实际上,它就像这样简单

adb shell dpm set-device-owner com.example.ookami.myapplication/.AdminReceiver

其中 com.example.ookami.myapplication/.AdminReceiver 是我们管理员接收器的路径。

为了取消应用程序作为设备所有者,运行此命令(但为了使其工作,您的 AndroidManifest 中的 application 标签应具有 android:testOnly="true" 属性)

adb shell dpm remove-active-admin com.example.ookami.myapplication/.AdminReceiver

我如何分发它?

该应用程序已准备好并经过测试,是时候将其交给客户了。 当然,`adb` 方法在这里是不可接受的,我们需要一些更简单的方法来安装我们的应用程序。

正如官方文档所说

引用

QR 码配置方法通过从设置向导扫描 QR 码来设置和配置设备所有者模式。 QR 码包含一个键值对的有效负载,其中包含 DPC 配置设备所需的所有信息。

因此,您需要为客户提供一个 QR 码。 如果您需要传递一些动态参数(例如,取决于客户或应用程序配置),那么您必须动态生成此 QR 码,否则您可以只创建此 QR 码一次并将其提供给所有客户(尽管如果使用包校验和,它仍然需要在每次发布新版本时更新 – 稍后将详细介绍)。

在最简单的情况下,可以使用一些在线工具生成此 QR 码,例如 这个。 您只需要在那里粘贴包含所有必需参数的 JSON。

您可以在 此处 查看所有可能的参数,我将仅提供最少的配置

{
  "android.app.extra.PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME": 
               "com.example.ookami.myapplication/.AdminReceiver",
  "android.app.extra.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION": 
               "http://example.com/app.apk",
  "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM": 
               "gJD2YwtOiWJHkSMkkIfLRlj-quNqG1fb6v100QmzM9w=",
}
  • android.app.extra.PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME 是我们在开发模式下使用的管理员接收器的相同路径
  • android.app.extra.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION 是我们应用程序 apk 的直接路径
  • android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM 是一个 string,保存此 apk 的 URL 安全的 base64 编码的 SHA-256 散列。 在 Linux/MacOS 上,可以使用以下命令获取
cat /path/to/app.apk | openssl dgst -binary -sha256 | openssl base64 | tr '+/' '-_' | tr -d '='

请注意,如果您使用此签名,则每次发布新版本的应用程序时都必须更新您的 QR 码。 您可以使用 android.app.extra.PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM,它应该包含 Android 软件包的任何签名的 URL 安全的 base64 编码的 SHA-256 校验和(但我无法使其正常工作)。

现在,当您的客户拥有 QR 码和干净(或恢复出厂设置)的设备时,他需要执行以下操作

  • 打开设备电源,等待欢迎屏幕出现。
  • 在此屏幕上的任意位置轻触 6 次 – 这将启动配置模式。
  • 通过输入凭据连接到 WiFi 网络,并等待平板电脑下载并启动 QR 码扫描器。
  • 扫描此 QR 码,应用程序将自动下载并安装。

如果一切顺利,您的应用程序将收到设备所有者模式,并可以授予自己必要的权限。

© . All rights reserved.