2014-10-20 10 views
5

NFC를 사용하는 기기에서 기기 소유자 패키지를 설정하려고합니다. 는 롤리팝 개요 here에서 언급 한 : 장치가 의 준비되지 않은 상태에있는 동안 배포하고 장치 소유자를 활성화하려면Android Lollipop에서 NFC를 사용하여 기기 소유자 활성화

, 당신은 장치에 프로그래밍 응용 프로그램에서 NFC 데이터 전송을 수행해야합니다. 이 데이터 전송은 관리되는 프로비저닝에 설명 된 프로비저닝 의도와 동일한 정보 인 을 전송합니다.

일단 이것이 설정되면 화면 고정 기능을 사용하여 기기를 키오스크 모드로 잠글 수 있습니다. 필자는 루트 장치에 data/system /에 device_owner.xml 파일을 배치하여 장치 소유자를 수동으로 설정하여이 키오스크 모드를 테스트 할 수있었습니다.

나는 방법이 해제 될 수 있도록하기 전에 NFC를 사용한 적이 있지만이 정보 here에 따라 다음 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); 

장치에이 전송 난 그냥 롤리팝 복원 한 미리보기로 표시 :

죄송합니다. 기기를 설정할 수 없습니다. IT 부서에 문의하십시오.

그것이 제공 요청을 받고 있다는 사실을 인식하고있는 것처럼 보이지만 설정 한 속성을 읽지 않는다고 생각합니다. Wi-Fi에 연결하려고 시도하지 않습니다.

답변

4

NdefRecord의 바이트를 올바르게 만들려면 Properties.store을 사용해야합니다.

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://stackoverflow.com/questions/26509770/provisioning-in-android-lollipop – Randy

1

저는 이것을 NFC에서도 사용할 수 있도록 노력했습니다. 나는 활동 내 넥서스 4 (킷캣)에 간단한 응용 프로그램을 설치 한 : 나는 7 롤리팝 미리보기 이미지 (면도칼 lpx13d - 미리보기 - ae4f461f.tgz)로 떠올랐다 내 넥서스을 번쩍와 NFC 준

@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이 프로비저닝되지 않았을 때 Nexus 4와 충돌하고 (깜박 거림 후 설정이 새로 생성되지 않음) 동일한 오류 메시지가 표시됩니다.

죄송합니다. 기기를 설정할 수 없습니다. IT 부서에 문의하십시오.

그런 다음 Nexus 7의 초기 장치 설정 (홈 화면을 볼 수있는 지점까지)을 실행 한 후 동일한 작업을 시도했습니다. 이번에 메시지를 받았습니다.

죄송합니다! 이 장치는 이미

을 설정하지만 넥서스 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의 소스 코드를 얻는 것이 확실히 도움이 될 것입니다.

+0

@Randy가 게시 한 답변으로이 기능을 사용할 수있게되었지만 체크 포인트 오류로 인해 관리 앱을 사용할 수 없습니다. IT 부서에 문의하십시오. ' – stevev

+0

Wi-Fi 설정을 성공적으로 제공 할 수 있었습니까? 내가 할 때 "Wi-Fi에 연결 중 ..."이라고 말하고 있지만 절대로 연결하지 않습니다. – Randy

+0

아니요, Wi-Fi 설정을 제거하고 첫 번째 설정 화면에서 입력 한 다음 NFC 범프를 수행했습니다. 그 때 체크섬 오류가 발생했습니다. 그걸로 더 이상 얻었습니까? – stevev

1

WiFi 매개 변수를 수동으로 입력해야합니다. Android 5.1에서 수정 된 버그가 있습니다.