配置Android Lollipop时的校验和错误

时间:2014-10-22 14:22:33

标签: android nfc android-5.0-lollipop

使用以下代码时,我收到消息Couldn't use the admin app due to a checksum error. Contact your IT department。基本上你有两个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 Developer Preview。我想完全有可能这个功能还没有完成。 更新:实际版本也采用这种方式。


APK: https://storage.googleapis.com/randy/DeviceOwnerCheck.apk
校验和: FRaAsqdPSjp9nC5hKIU / ElPv + e4
结果:使用此URL并且此校验和会出现错误,甚至无法访问加密设备屏幕。


我还向GitHub发布了两个申请。一个人发送NFC数据。另一个只是一个应用程序来检查应用程序是设备管理员还是设备所有者。希望有人发现这很有用。如果您想自己构建DeviceOwnerCheck,则需要修改URL和校验和。

3 个答案:

答案 0 :(得分:16)

哈希码必须是url安全的。这会转换并删除尾随填充

$ cat Something.apk | openssl dgst -binary -sha1 | openssl base64 | tr '+/' '-_' | tr -d '='

答案 1 :(得分:6)

它似乎不喜欢校验和中的特殊字符。我能够使用我的apk文件,但校验和没有任何特殊字符。当我尝试使用你的apk文件时,我得到了同样的错误。尝试重新创建apk,直到它没有特殊字符,然后它应该工作。

我猜测有一些特殊字符丢失了。

答案 2 :(得分:2)

这是获取哈希码的命令。

$ cat Something.apk | openssl dgst -binary -sha1 | openssl base64

此外,删除任何尾随填充(=)。