当我使用以下代码时,收到消息由于校验和错误无法使用管理员应用程序。请联系您的IT部门
。 基本上,您有两个Android Lollipop设备。一个设备未配置(出厂重置),另一个安装了此编程应用程序。 编程应用程序向未配置的设备发送NFC命令,告诉它使用您传递给它的数据开始配置。根据DevicePolicyManager的要求,需要三个字段(APK位置、APK文件校验和和包名称)。MIME_TYPE_PROVISIONING_NFC。
APK正在下载。 我正在检查我的服务器日志,清楚地显示它来自该设备(AndroidDownloadManager
在用户代理中)。
根据DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM,它是文件的SHA-1校验和。 校验和不匹配。我尝试过许多不同格式的校验和(十六进制、带空格的十六进制、大写/小写、Base64、文本),但可能我错过了某个测试。
不幸的是,Android Lollipop源代码尚不可用,否则我会在那里检查。
我该如何解决这个问题? 有什么想法吗?
public class ProvisionerActivity extends Activity implements CreateNdefMessageCallback {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
NfcAdapter mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
mNfcAdapter.setNdefPushMessageCallback(this, this);
}
@Override
public NdefMessage createNdefMessage(NfcEvent event) {
try {
Properties p = new Properties();
p.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, "com.example.deviceownertest");
p.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION, "http://example.com/DeviceOwnerTest.apk");
p.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM, "19138948d8a607617971af724ffd08dd7eab771b");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
OutputStream out = new ObjectOutputStream(bos);
p.store(out, "");
byte[] bytes = bos.toByteArray();
NdefMessage msg = new NdefMessage(NdefRecord.createMime(DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC, bytes));
return msg;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
注意: 这是使用最新的Android L开发者预览版. 我猜这个功能可能还没有完全完成。
更新: 实际发布版本也是这样的。
APK: https://storage.googleapis.com/randy/DeviceOwnerCheck.apk
Checksum: FRaAsqdPSjp9nC5hKIU/ElPv+e4
Result: 使用这个URL和验证码会出错,甚至无法到达加密设备屏幕。
我还在GitHub上发布了两个应用程序。其中一个将NFC数据发送到配置文件中。另一个只是一个检查应用程序是否为设备管理员或设备所有者的应用程序。希望有人会发现这很有用。如果你想构建DeviceOwnerCheck,则需要修改URL和验证码。