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

问题描述:

我试图在使用NFC的设备上设置设备所有者软件包。将在棒棒堂概述here提到:在Android上使用NFC激活设备所有者棒棒糖

部署和激活设备所有者,您必须在设备处于 其未接通的状态下执行从编程应用的NFC数据传输 到设备。此数据传输发送与Managed provisioning中所述的供应意图相同的信息 。

原因是一旦设置了这个设置,您可以使用屏幕锁定功能将设备锁定在自助服务终端模式下。我已经能够通过将device_owner.xml文件放置到具有根设备上的data/system /来手动设置设备所有者来测试此Kiosk模式。

我从来没有使用NFC之前,所以我可能是遥远,但我有以下NdefMessage想出了基于该信息here

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

发送这一个设备,我刚才用棒棒糖恢复预览使其显示:

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

它似乎认识到它正在接收提供请求的事实,但我不认为它正在读取我设置的属性,它不尝试连接WiFi。

看来您需要使用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和校验和失败的问题。完全不知道为什么。

+0

我发布了自己关于校验和失败的问题:http://*.com/questions/26509770/provisioning-in-android-lollipop – Randy 2014-10-22 14:23:01

我一直试图让这个工作通过NFC。我安装了一个简单的应用程序在我的Nexus 4(奇巧)与活动:

@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(); 
    } 
} 

我亮出我的Nexus 7闪现与棒棒堂预览图像(剃刀lpx13d预览-ae4f461f.tgz),并赋予它一个NFC当Nexus 7未设置时(无设置 - 闪烁后新鲜)与Nexus 4碰撞并得到相同的错误信息:

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

然后,我尝试了同样的事情,但这次运行了Nexus 7上的初始设备设置后(我可以看到主屏幕)。这一次我得到了消息

糟糕!此装置已建立

但是这一次,我能看到一些日志记录,因为我是能够安装USB调试上的Nexus 7:

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的源代码肯定会有所帮助。

+0

我得到这个与@Randy发布的答案一起工作 - 但我现在坚持在同一点:'由于校验和错误,无法使用管理应用程序。联系您的IT部门# – stevev 2014-10-22 21:28:10

+0

您是否能够成功配置wifi设置?当我这样做时,它会在那里说“连接到Wi-Fi ......”,但从不连接。 – Randy 2014-10-23 13:44:36

+0

不,我删除了wifi设置,在第一个设置屏幕中输入了它们,然后做了NFC碰撞。那是当我得到校验和错误。你有没有更进一步呢? – stevev 2014-10-23 16:49:33

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