Android + XMPP
21/12/12 04:38
XMPP for Android
について。
XMPP for Java
にはsmack
があり、Android
にはsmack
にパッチをあてたasmackがあるようだけど、asmack
のメンテナンス状態はよくないみたい。普通にそこのを使ってsmack
ぽくプログラムを書いてくと、色んなエラーが出る感じ。ググったところ、asmack
の派生がいくつかでてるみたい。
Beem内部で使ってるasmackとか、ここにはasmack
の派生のbuild environment
があって、元々のasmackよりはよさげ。
けど、PubSubManagerクラスのgetNodeメソッドなんかを使うあたりで、"java.lang.ClassCastException: org.jivesoftware.smack.util.PacketParserUtils…" というエラーなどがでて詰んでいる人がググったら見受けられる。
きちんと動かすには、XMPPConnection
を使う前に、org.jivesoftware.smackx.ConfigureProviderManager.configureProviderManager();
を呼んだり、KeyStore jks implementation not found
なので、bks
に設定したり、
例:config.setTruststoreType("BKS");
config.setTruststorePath("/system/etc/security/cacerts.bks”);
同じくProvider
を明示したり、
例:
ProviderManager pm = ProviderManager.getInstance();
pm.addIQProvider("pubsub","http://jabber.org/protocol/pubsub", new org.jivesoftware.smackx.pubsub.provider.PubSubProvider());
…
などと、色々とsmack
にはない手続きを踏ます必要がある。更に、Subscribeされたデータを読むと、データがあるはずなのにnullってなっちゃったりする。これはXmlPullParserがうまくパースしてくれてないみたいなので、強引に直す。例えば、org.jivesoftware.smackx.pubsub.provider.ItemProvider.java の中を、
if (parser.getEventType() == XmlPullParser.START_TAG) {
payloadText.append("<").append(parser.getName());
int n = parser.getAttributeCount();
for (int i = 0; i < n; i++) {
payloadText.append(" ").append(
parser.getAttributeName(i)).append("=\"")
.append(parser.getAttributeValue(i))
.append("\"");
}
if (parser.isEmptyElementTag()) {
payloadText.append("/>");
degenerated = true;
} else
payloadText.append(">");
} else if (parser.getEventType() == XmlPullParser.END_TAG) {
if (degenerated)
degenerated = false;
else
payloadText.append("").append(parser.getName()).append(">");
} else if (parser.getEventType() == XmlPullParser.TEXT) {
payloadText.append(parser.getText());
}
tag = parser.next();
}
こういう感じの処理を追加。ライブラリのソースをいじるのは気が引けるけど、仕方ない。。