3

我正在为 XMPPConnection 使用以下代码来获取密钥库证书

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的来源后,我怀疑它在

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

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

所有博客都说上面的代码应该可以工作,您不需要为信任存储设置路径。

任何想法?

4

2 回答 2

1

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

您必须在 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的所有者

于 2013-06-11T11:04:44.887 回答
0

一旦我从他们自己的网站使用最新版本的 ASmack 库,这个问题就解决了

于 2013-06-12T21:36:04.593 回答