在Android棒棒糖上使用NFC激活设备所有者

在Android棒棒糖上使用NFC激活设备所有者,android,nfc,android-5.0-lollipop,device-policy-manager,Android,Nfc,Android 5.0 Lollipop,Device Policy Manager,我正在尝试在使用NFC的设备上设置设备所有者包。棒棒糖概述中提到了以下问题: 要部署和激活设备所有者,必须执行NFC数据访问 当设备处于运行状态时,从编程应用程序传输到设备 它的未预见状态。此数据传输发送相同的信息 与托管资源调配中描述的资源调配意图相同 原因是一旦设置好,您就可以使用屏幕固定功能将设备锁定在kiosk模式。我已经能够通过将device_owner.xml文件放置到根设备上的data/system/来手动设置设备所有者来测试this kiosk模式 我以前从未使用过NFC,所以我

我正在尝试在使用NFC的设备上设置设备所有者包。棒棒糖概述中提到了以下问题:

要部署和激活设备所有者,必须执行NFC数据访问 当设备处于运行状态时,从编程应用程序传输到设备 它的未预见状态。此数据传输发送相同的信息 与托管资源调配中描述的资源调配意图相同

原因是一旦设置好,您就可以使用屏幕固定功能将设备锁定在kiosk模式。我已经能够通过将device_owner.xml文件放置到根设备上的data/system/来手动设置设备所有者来测试this kiosk模式

我以前从未使用过NFC,所以我可能离此很远,但我根据这些信息想出了以下NDEFM消息:

将此信息发送到我刚刚使用棒棒糖预览还原的设备,会导致该设备显示:

哎呀!无法设置您的设备。联系您的IT部门


它似乎意识到它正在接收一个供应请求,但我认为它没有读取我设置的属性,它没有尝试连接wifi。

我也一直在尝试通过NFC实现这一点。我在Nexus 4(KitKat)上安装了一个简单的应用程序,其中包含一个活动:

@Override
protected void onResume() {
    super.onResume();
    try {
        Properties properties = new Properties();
        properties.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, "com.deviceowner.app");
        properties.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION, "https://docs.google.com/uc?export=download&id=........");
        properties.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM, "6ee735dfb8090ab1862fecce430864e21a0e37");
        properties.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_WIFI_SSID, "wlan");
        properties.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PASSWORD, "XXXXXX");
        properties.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_WIFI_SECURITY_TYPE, "WPA2");

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutput out = new ObjectOutputStream(bos);
        out.writeObject(properties);
        byte[] yourBytes = bos.toByteArray();
        NdefRecord ndefRecord = NdefRecord.createMime(DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC, yourBytes);
        NdefMessage msg = new NdefMessage(ndefRecord);
        nfcAdapter.setNdefPushMessage(msg, this);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
我用棒棒糖预览图像(razor-lpx13d-preview-ae4f461f.tgz)闪现了我的Nexus 7,并在Nexus 7未设置(无设置-闪现后刷新)时用Nexus 4对其进行了NFC碰撞,得到了相同的错误消息:

哎呀!无法设置您的设备。联系您的IT部门

然后我尝试了同样的方法,但这次是在运行了Nexus7上的初始设备设置之后(我可以看到主屏幕)。这次我得到消息了

哎呀!此设备已设置

但这一次,我能够看到一些日志记录,因为我能够在Nexus 7上设置USB调试:

10-22 10:31:29.947    2610-2610/? D/NfcService﹕ LLCP Activation message
10-22 10:31:29.947    2610-2610/? I/NfcP2pLinkManager﹕ LLCP activated
10-22 10:31:29.947    2610-2610/? D/NfcP2pLinkManager﹕ onP2pInRange()
10-22 10:31:29.954    2610-2610/? W/AudioTrack﹕ AUDIO_OUTPUT_FLAG_FAST denied by client
10-22 10:31:29.962      184-547/? D/audio_hw_primary﹕ select_devices: out_snd_device(2: speaker) in_snd_device(0: none)
10-22 10:31:29.962      184-547/? D/ACDB-LOADER﹕ ACDB -> send_afe_cal
10-22 10:31:29.962      184-547/? D/audio_hw_primary﹕ enable_snd_device: snd_device(2: speaker)
10-22 10:31:29.974      184-547/? D/audio_hw_primary﹕ enable_audio_route: apply and update mixer path: low-latency-playback
10-22 10:31:29.981    2610-2610/? D/NfcP2pLinkManager﹕ Last registered callback is not running in the foreground.
10-22 10:31:29.987    2610-2610/? D/NfcP2pLinkManager﹕ Disabling default Beam behavior
10-22 10:31:29.987    2610-2610/? D/NfcP2pLinkManager﹕ mMessageToSend = null
10-22 10:31:29.987    2610-2610/? D/NfcP2pLinkManager﹕ mUrisToSend = null
10-22 10:31:29.996    2610-2610/? D/NfcP2pLinkManager﹕ Took 48 to get first LLCP PDU
10-22 10:31:30.599    3224-3224/? I/wpa_supplicant﹕ wlan0: CTRL-EVENT-SCAN-STARTED
10-22 10:31:31.741    2610-2610/? D/NfcP2pLinkManager﹕ onP2pReceiveComplete()
10-22 10:31:31.751    2610-2610/? D/NfcService﹕ mock NDEF tag, starting corresponding activity
10-22 10:31:31.751    2610-2610/? D/NfcService﹕ TAG: Tech [android.nfc.tech.Ndef]
10-22 10:31:31.757    2610-3275/? W/AudioTrack﹕ AUDIO_OUTPUT_FLAG_FAST denied by client
10-22 10:31:31.770     549-2765/? I/ActivityManager﹕ START u0 {flg=0x10008000 cmp=com.android.nfc/.NfcRootActivity (has extras)} from uid 1027 on display 0
10-22 10:31:31.795    7237-7237/? D/ManagedProvisioning﹕ Device owner provisioning activity ONDESTROY
10-22 10:31:31.827    2610-3275/? W/AudioTrack﹕ AUDIO_OUTPUT_FLAG_FAST denied by client
10-22 10:31:31.848     549-2335/? I/ActivityManager﹕ START u0 {act=android.nfc.action.NDEF_DISCOVERED typ=application/com.android.managedprovisioning cmp=com.android.managedprovisioning/.DeviceOwnerProvisioningActivity (has extras)} from uid 1027 on display 0
10-22 10:31:31.886    7237-7237/? D/ManagedProvisioning﹕ Device owner provisioning activity ONCREATE
10-22 10:31:31.887    7237-7237/? E/ManagedProvisioning﹕ Device already provisioned.
10-22 10:31:31.903    7237-7237/? D/ManagedProvisioning﹕ Device owner provisioning activity ONRESUME
10-22 10:31:32.011      549-621/? I/ActivityManager﹕ Displayed com.android.managedprovisioning/.DeviceOwnerProvisioningActivity: +149ms (total +200ms)
10-22 10:31:32.955    2610-2610/? D/NfcService﹕ LLCP Link Deactivated message. Restart polling loop.
10-22 10:31:32.955    2610-2610/? I/NfcP2pLinkManager﹕ LLCP deactivated.
10-22 10:31:32.955    2610-2610/? D/NfcP2pLinkManager﹕ Debounce timeout
10-22 10:31:32.955    2610-2610/? D/NfcP2pLinkManager﹕ onP2pOutOfRange()

因此,似乎设备所有者NFC通气只能发生在未配置设备上。我很感激这不能回答您的问题,但是日志输出可能会有所帮助。掌握DeviceOwnerProvisioningActivity的源代码肯定会有所帮助。

看来您需要使用
属性。store
来正确创建NdefRecord的字节

Properties properties = new Properties();
properties.setProperty(...);

ByteArrayOutputStream bos = new ByteArrayOutputStream();
OutputStream out = new ObjectOutputStream(bos);
properties.store(out, "");
byte[] bytes = bos.toByteArray();

NdefMessage msg = new NdefMessage(NdefRecord.createMime(DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC, bytes));

目前,我下载我的APK时遇到问题,校验和失败。根本不知道原因。

您应该手动输入WiFi参数。Android 5.1中有一个错误已经被纠正

我在这里发布了我自己关于校验和失败的问题:我得到这个问题是为了与@Randy发布的答案一起工作-但我现在被困在同一点上:
由于校验和错误而无法使用管理员应用程序。联系您的IT部门
您是否能够成功设置wifi设置?当我这样做的时候,它坐在那里说“连接到Wi-Fi…”,但从未连接。不,我删除了wifi设置,在第一个设置屏幕中输入它们,然后NFC启动。那就是我得到校验和错误的时候。你有进一步的了解吗?没有。我尝试将wifi设置设置为自动连接,而不必手动输入凭据(因为我很懒),但它无法连接到wifi。当我删除wifi设置时,需要手动连接到wifi。一旦我手动连接,它就会下载APK,但每次校验和都失败。Wifi也有同样的问题。如果我输入wifi安全类型,似乎会发生异常。没有这个参数,我有一个无限的“连接”。不确定格式。
Properties properties = new Properties();
properties.setProperty(...);

ByteArrayOutputStream bos = new ByteArrayOutputStream();
OutputStream out = new ObjectOutputStream(bos);
properties.store(out, "");
byte[] bytes = bos.toByteArray();

NdefMessage msg = new NdefMessage(NdefRecord.createMime(DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC, bytes));