2014-11-05 12 views
1

Я использую asmack-андроид-8-4.0.5.jar от http://asmack.freakempire.de/4.0.5/Я могу подключиться и успешно войти в систему, но когда я пытаюсь загрузить мой собственный vcard он бросает classcastexception в vcard.doload метод. пожалуйста, помогите кому-нибудь. Ниже полный код, который я использую.Android asmack ClassCastException визитную карточку во время вызова vcard.load (Conn)

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) 
+0

Всегда включать полное исключение ** включая ** их StackTrace! – Flow

+0

hi @Flow Как раз сейчас я узнал, что vcard моего кода отлично работает с сервером gtalk, но не работает на vcard с серверами xmpp.jp или jabber.se. вы можете предложить хороший сервер, который отправляет xml respnse в шапки. или как я могу это исправить? Примечание. У меня есть приложение, использующее asmack source. – sanidhya09

+0

Почему это не удается? Почему вы не добавили запрашиваемую информацию? – Flow

ответ

0

Эй я столкнуться с такой же тоже я нашел это:

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

изменить это на

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

и печать этого , возвращенный пакет vcard perfect имеет все поля N FN EMAIL TEL как теги XML, исключение класса cast - это потому, что Vcard.java расширяется как IQ, IQ - это класс, который расширяет пакет

На данный момент я использую SAXParser и xml для извлечения сведений, которые я читал из пакет объектов выше и сохранить его в vcard по мере необходимости, все равно не удастся, но извлечение работает.

Started к лицу проблемы после обновления, разместит лучшее решение в ближайшее время, если @flow может ответить или исправить это, что было бы здорово

+0

ничего не нужно менять, библиотека asmack потрясающая. Это происходит при вызове vcard.load (conn), когда у вас нет надлежащего vcard с установленным на нем аватаром. Я хотел бы посмотреть, как вы сохраняете vcard. – sanidhya09

+0

Используется Spark (igniteRealtime), чтобы установить vCard, спасибо, проверит, установив через asmack –

+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(); 
    } 
} 

Loaded theVcard этим способом:

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; 

} 
+0

будет проверять сейчас и возвращаться к вам –

+0

Могу я попросить вас сообщить о ваших выводах в [Smack Developers] (http: //community.igniterealtime.org/community/developers/smack) форум? Мне все еще неясно, что именно вызывает это. – Flow