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 が 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の所有者に通知しました

于 2013-06-11T11:04:44.887 に答える
0

この問題は、自分の Web サイトから最新バージョンの ASmack ライブラリを使用すると解決されました

于 2013-06-12T21:36:04.593 に答える