设置Android棒棒糖时出现校验和错误

设置Android棒棒糖时出现校验和错误,android,nfc,android-5.0-lollipop,Android,Nfc,Android 5.0 Lollipop,由于校验和错误,我收到消息无法使用管理员应用程序。使用以下代码时,请联系您的IT部门。基本上你有两个安卓棒棒糖设备。一个设备未设置(出厂重置),另一个设备上有此编程应用程序。编程应用程序向未设置的设备发送NFC命令,告知其使用您传递给它的数据开始设置。根据DevicePolicyManager,需要三个字段(APK位置、APK文件校验和和和包名称) 正在下载APK。我正在检查服务器日志,它显然来自设备(AndroidDownloadManager位于用户代理中) 根据DevicePolicyMa

由于校验和错误,我收到消息
无法使用管理员应用程序。使用以下代码时,请联系您的IT部门
。基本上你有两个安卓棒棒糖设备。一个设备未设置(出厂重置),另一个设备上有此编程应用程序。编程应用程序向未设置的设备发送NFC命令,告知其使用您传递给它的数据开始设置。根据DevicePolicyManager,需要三个字段(APK位置、APK文件校验和和和包名称)

正在下载APK。我正在检查服务器日志,它显然来自设备(
AndroidDownloadManager
位于用户代理中)

根据DevicePolicyManager。它是文件的SHA-1校验和。校验和不匹配。我已经尝试了很多不同的校验和格式(十六进制,带空格的十六进制,大写/小写,base64,text),我想我可能错过了一个测试

不幸的是,Android棒棒糖的源代码还不可用,否则我会在那里查看

我该如何解决这个问题?有什么想法吗

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

注意:这是最新版本。我想这项功能完全有可能还没有完成。 更新:实际版本也是这样


APK:
校验和:FRaAsqdPSjp9nC5hKIU/ElPv+e4
结果:使用此URL和此校验和会出现错误,甚至无法进入加密设备屏幕



我还把两份申请发到了。将NFC数据发送到供应。另一个只是一个应用程序,用于检查该应用程序是设备管理员还是设备所有者。希望有人觉得这很有用。如果您想构建DeviceOwnerCheck自己,您需要修改URL和校验和。

下面是获取哈希代码的命令

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

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

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


我猜有某种特殊字符的转义丢失了。

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

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

不幸的是,这给了我和以前一样的结果。校验和不匹配。我用我正在使用的APK的链接更新了我的问题。还为我正在使用的两个应用程序添加了github链接(一个用于推送NFC数据,另一个是实际应用程序)。我遇到了与您最初遇到的问题相同的问题,直到我实现了Yuichi的soution。这是特殊字符!我只是重新编译了几次,直到它创建了一个APK谁的校验和不包括任何特殊字符。真奇怪。但是,我很好奇什么是使APK工作的正确方法。是的,这很奇怪,我猜有一些方法可以正确地转义特殊字符。还应该注意,如果URL不正确或下载失败,也会发生相同的错误。嗨,Rob,我在使用NFC安装设备所有者应用程序时遇到了相同的问题校验和错误,我尝试了上面的命令来创建校验和,但仍然出现了相同的问题,请告诉我下面我的命令哪里做错了:cat/home/user/Downloads/adt-bundle-linux-x86_64-20140702/sdk/platform tools/DevicePolicyDemo_2.1.apk | openssl dgst-binary-sha1 | openssl base64 | tr'+/'-| tr-d'='我面临的问题与我使用此命令时遇到的问题相同“C:\Program Files\Java\jdk-11.0.1\bin>keytool-printcert-jarfile”C:\\Projects\\MyEG\MyLogistics\app\build\outputs\apk\dev\debug\TestDPC_5001.apk”;“C:\Program Files\Git\usr\bin\openssl.exe”dgst-binary-sha1 |“C:\Program Files\Git\usr\bin\openssl.exe”base64++tr'/''-'''.\u124; tr-d''“不是外部或内部命令。所以我可以在哪里找到tr命令,当我使用这个命令时,C:\Program Files\Java\jdk-11.0.1\bin>keytool-printcert-jarfile“C:\\Projects\\MyEG\MyLogistics\app\build\outputs\apk\dev\debug\TestDPC_5001.apk”;“C:\Program Files\Git\usr\bin\openssl.exe”dgst-binary-sha1 |“C:\Program Files\Git\usr\bin\openssl.exe”base64 Rk7aTikXRwU2KrAsqvCABbaLX+g=不带tr命令,因此它给出的值与给定示例中的值不同。那么,您在使用这两款Github应用程序时缺少了什么?我遇到了相同的错误消息,我尝试了不同的下载URL,以及发布版和调试版。我的校验和看起来不错,没有尾随空格,没有特殊字符。你能告诉我你改变了什么让它工作吗?@InnekedClippel我现在可以让任何APK正常工作了。见@Rob的答案。他的解决方案将校验和转换为URL安全字符串。它用
-
替换
+
,用
-
替换
/
,并完全删除填充(
=
)。还请注意@DeeV的评论,其中说如果URL不正确或下载失败,您将收到相同的错误消息,因此请检查您的apache或IIS日志。祝你好运非常感谢你。经过反复试验,我终于成功了。似乎我使用了错误的校验和。@Inneke您能告诉我创建校验和的确切命令吗,因为我使用的是Rob建议的相同命令,但尚未成功。@suniljain我使用的命令(注意,这是在Windows上)是:键入“C:\Users\Inneke\Documents\Projects\KioskTest\app\app debug.apk”|“C:\Program Files(x86)\GnuWin32\bin\openssl“dgst-binary-sha1 |”C:\ProgramFiles(x86)\GnuWin32\bin\openssl”base64。这输出如下:abc9abcab0abc+ABca1bc=。我删除“=”并将“+”替换为“-”,将“/”替换为“\”。因此,我在应用程序中使用的是:p.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM,“ABC9ABCAB0ABC-ABca1bc”);请注意,您必须将路径写入.apk文件,而不是