在安卓棒棒糖系统中,通过NFC激活设备所有者

5
我正在尝试使用NFC在设备上设置设备所有者程序。Lollipop概述(此处)中提到了这一点:

要部署和激活设备所有者,必须在设备处于未配置状态时从编程应用向设备执行NFC数据传输。此数据传输发送与托管配置中描述的配置意图相同的信息。

原因是一旦设置了设备所有者,您就可以使用屏幕固定功能将设备锁定在展示模式下。我已经通过将device_owner.xml文件放置在rooted设备的data/system/目录下来手动设置设备所有者,并成功测试了该展示模式。
我以前从未使用过NFC,因此我可能偏离了正题,但根据(此处)的信息,我制作了以下基于NdefMessage的代码:
Properties properties = new Properties();
properties.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, "com.my.package");
properties.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_WIFI_SSID, "MyWiFiSSID");
properties.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PASSWORD, "WifiPassword");
properties.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM, "C9AD9E082457819B54CF76255A400375E4127112");
properties.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION, "https://dl.dropboxusercontent.com/u/xxx/app-release.apk");


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

将此发送至我刚刚使用Lollipop预览版恢复的设备会导致它显示:

糟糕!无法设置您的设备。请联系您的IT部门。

似乎它正在识别接收到的配置请求,但我认为它没有读取我设置的属性,也没有尝试连接wifi。

3个回答

4

看起来你需要使用 Properties.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文件时校验和失败。不确定原因。


我在这里发布了一个关于校验和失败的问题:https://dev59.com/c18d5IYBdhLWcg3wt0Ky - Randy

1

我一直在尝试使用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();
    }
}

我刷了Lollipop预览版镜像(razor-lpx13d-preview-ae4f461f.tgz)到我的Nexus 7上,并在Nexus 7未进行设置(刷机后新机状态)时,使用Nexus 4进行NFC传输,结果得到相同的错误信息:

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

然后我再次尝试同样的操作,但这次是在Nexus 7上完成了最初的设备设置(直到可以看到主屏幕)。这次我收到的消息是:

哎呀!此设备已经设置好了。

但这一次,我可以看到一些日志,因为我能够在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的源代码肯定会有所帮助。


我按照@Randy发布的答案解决了这个问题 - 但是现在我遇到了同样的问题:无法使用管理员应用程序,因为出现了校验和错误。请联系您的IT部门。 - stevev
你能成功配置WiFi设置吗?当我尝试时,它一直显示“正在连接WiFi...”,但从未连接成功。 - Randy
不行。我试着把wifi设置放进去,这样它就可以自动连接,我就不用手动输入凭据了(因为我很懒),但是它无法连接到wifi。当我删除了wifi设置后,它就要求我手动连接wifi。一旦我手动连接上了,它就会下载APK,但每次校验和都失败。 - Randy
这个WiFi有没有连上?我也遇到了同样的“连接”问题,尽管我可以看到WiFi图标已经连接。 - zaitsman
1
这里也有同样的Wifi问题。如果我输入了Wifi安全类型,似乎会出现异常。没有这个参数,我就一直处于“连接中”的状态。不确定格式。 - Hartok
显示剩余2条评论

1
你需要手动输入WiFi参数。在Android 5.1中已经修复了一个错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接