调用vcard.load(conn)时,Android asmack vcard classcastException

时间:2014-11-05 08:05:13

标签: android xmpp asmack vcard

我正在使用来自http://asmack.freakempire.de/4.0.5/的asmack-android-8-4.0.5.jar 我能够连接并成功登录,但是当我尝试加载自己的时候vcard它会在vcard.doload方法中抛出classcastexception。请帮助任何人。下面是我正在使用的完整代码。

private class ConnectTask extends AsyncTask<URL, Integer, Long> {
    protected Long doInBackground(URL... urls) {

        Roster.setDefaultSubscriptionMode(SubscriptionMode.accept_all);
        configure(new ProviderManager());
        ConnectionConfiguration config = new ConnectionConfiguration(
                "my host here", 5222, "xmpp.jp");
        config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
        config.setCompressionEnabled(true);
        ProviderManager.addIQProvider("vCard", "vcard-temp",
                new VCardProvider());
        connection = new XMPPTCPConnection(config);
        try {
            connection.connect();
            System.out.println("sanidhya09 connected");

            try {
                connection.login("sanidhya09", "*****");
                System.out.println("sanidhya09 logged in ");
            } catch (SaslException e) {
                e.printStackTrace();
            } catch (XMPPException e) {
                e.printStackTrace();
            } catch (SmackException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        } catch (Exception e) {
            System.err.println("sanidhya09 Failed to connect to "
                    + "xmpp.jp");
            return null;
        }
        return null;
    }

    protected void onPostExecute(Long result) {
        Presence pres = new Presence(Presence.Type.available);

        try {
            connection.sendPacket(pres);
        } catch (NotConnectedException e1) {
            e1.printStackTrace();
        }
        VCard vCard = new VCard();
        try {
            ProviderManager.addIQProvider("vCard", "vcard-temp",
                    new VCardProvider());
            System.out.println("sanidhya09 vcard trying");
            vCard.load(connection);
            System.out.println("sanidhya09 vcard loaded");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这是一个例外:

  java.lang.ClassCastException: org.jivesoftware.smack.util.PacketParserUtils$2 cannot be cast to org.jivesoftware.smackx.vcardtemp.packet.VCard
11-05 16:09:57.379: W/System.err(26675):    at org.jivesoftware.smackx.vcardtemp.packet.VCard.doLoad(VCard.java:560)
11-05 16:09:57.379: W/System.err(26675):    at org.jivesoftware.smackx.vcardtemp.packet.VCard.load(VCard.java:542)
11-05 16:09:57.379: W/System.err(26675):    at com.sanidhya.chatdemo.MainActivity$ConnectTask.onPostExecute(MainActivity.java:111)
11-05 16:09:57.379: W/System.err(26675):    at com.sanidhya.chatdemo.MainActivity$ConnectTask.onPostExecute(MainActivity.java:1)
11-05 16:09:57.380: W/System.err(26675):    at android.os.AsyncTask.finish(AsyncTask.java:632)
11-05 16:09:57.380: W/System.err(26675):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
11-05 16:09:57.380: W/System.err(26675):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
11-05 16:09:57.380: W/System.err(26675):    at android.os.Handler.dispatchMessage(Handler.java:102)
11-05 16:09:57.380: W/System.err(26675):    at android.os.Looper.loop(Looper.java:136)
11-05 16:09:57.380: W/System.err(26675):    at android.app.ActivityThread.main(ActivityThread.java:5086)
11-05 16:09:57.380: W/System.err(26675):    at java.lang.reflect.Method.invokeNative(Native Method)
11-05 16:09:57.380: W/System.err(26675):    at java.lang.reflect.Method.invoke(Method.java:515)
11-05 16:09:57.380: W/System.err(26675):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
11-05 16:09:57.380: W/System.err(26675):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
11-05 16:09:57.380: W/System.err(26675):    at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:2)

我现在就开始工作了。实际上他们是xml响应中的一个问题。它没有头像或者有一个故障的化身。保存头像时我甚至有一个错误的base64。

通过以这种方式保存化身来实现它:

    private void uploadProfilePic() {
    try {
        Bitmap resized = Bitmap.createScaledBitmap(selected_img,128, 128,
                true);
        obj_UserInfo.setProfilePic(resized);
        String get64BaseString = get64BaseString(resized);

        VCard vCard = new VCard();

        vCard.setAvatar(get64BaseString, "image/jpeg");
        vCard.save(CGlobalVarriables.connection);
        System.out.println("image upload successfuls");
        CGlobalVarriables.obj_UserInfo.setProfilePic(resized);


    } catch (Exception e) {
        e.printStackTrace();
    }
}

通过这种方式加载了这张卡片:

private Bitmap getProfilePic() {

    VCard vCard = new VCard();
    try {
        vCard.load(CGlobalVarriables.connection);
        byte[] array = vCard.getAvatar();
        Bitmap bitmap = BitmapFactory.decodeByteArray(array, 0,
                array.length);

        return bitmap;

    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;

}

答案 1 :(得分:0)

嘿,我也面对同样的事情,我发现了这个:

VCard result = (VCard) connection.createPacketCollectorAndSend(this).nextResultOrThrow();

将此更改为

Packet packet = connection.createPacketCollectorAndSend(this).nextResultOrThrow(); 

并打印这个,返回的vcard包是完美的,所有N FN EMAIL TEL字段都是XML标签,类转换异常是因为Vcard.java扩展为IQ,IQ是扩展包的类

现在我正在使用SAXParser和xml来提取我从上面的对象包中读取的详细信息,并根据需要将其保存在vcard中,但仍然没有成功,但提取工作正常。

升级后开始面临问题,很快就会发布更好的解决方案,如果@flow可以回答或解决这个问题很棒