AndroidCAStore在4.2.2 Jellybean上抛出NullPointerException警告

时间:2013-05-23 00:55:28

标签: android xmpp keystore asmack

我正在使用以下代码获取XMPPConnection来获取Keystore证书

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
    conf.setTruststoreType("AndroidCAStore");
    conf.setTruststorePassword(null);
    conf.setTruststorePath(null);
}

此代码工作正常,我可以验证用户。但它也会抛出异常作为警告

W/System.err(18470): java.lang.NullPointerException
W/System.err(18470):    at java.io.File.fixSlashes(File.java:185)
W/System.err(18470):    at java.io.File.<init>(File.java:134)
W/System.err(18470):    at java.io.FileInputStream.<init> FileInputStream.java:105)
W/System.err(18470):    at org.jivesoftware.smack.ServerTrustManager.<init>(ServerTrustManager.java:71)
W/System.err(18470):    at org.jivesoftware.smack.XMPPConnection.proceedTLSReceived(XMPPConnection.java:871)
W/System.err(18470):    at org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:221)

在查看ServerTrustManager的source之后,我怀疑它在

处失败了
in = new FileInputStream(configuration.getTruststorePath());

这是否意味着android无法找到TruststorePath,如果是,我应该在哪里指向它。

所有博客都说上面的代码应该有效,你不需要设置信任存储的路径。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。 原因很简单,TrusstorePath为null,这就是问题所在。

您必须在org.jivesoftware.smack中的ServerTrustManager.java中更改几行

if(options.getPassword() != null) {
    password = options.getPassword().toCharArray();
}

if(options.getPath() == null) {
    trustStore.load(null, password);
} else {
    in = new FileInputStream(options.getPath());
    trustStore.load(in, password);
}

而不是

in = new FileInputStream(configuration.getTruststorePath());

我添加了

InputStream in = null;
char[] password = null;

到同步块的顶部。

我已通知https://github.com/Flowdalic/asmack

的所有者

答案 1 :(得分:0)

一旦我从他们自己的网站

使用最新版本的ASmack库,这个问题就解决了