note


Android + XMPP

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("");
} else if (parser.getEventType() == XmlPullParser.TEXT) {
payloadText.append(parser.getText());
}

tag = parser.next();
}


こういう感じの処理を追加。ライブラリのソースをいじるのは気が引けるけど、仕方ない。。