Невозможно подключить сервер XMPP к ASmack в Android

У меня есть полностью работающий чат-клиент, который я сделал на Java. Теперь я с нетерпением жду возможности реализовать то же самое на своем устройстве Android. Я начал с импорта библиотеки ASmack в свой проект и проверяю на каждом этапе, чтобы избежать ошибок. Я застрял на самом первом шаге, хотя. Моя активность не может найти класс в ASmack Jar, поэтому я предполагаю, что не могу продолжить.

Мой простой код:

package com.test.mypro;

import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

    public class TestProjectActivity extends Activity {
        private static final String LOG_TAG = "TESTER";
        /** Called when the activity is first created. */
        TextView tvHello;
        XMPPConnection connection;
        ConnectionConfiguration config;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            tvHello = (TextView) findViewById(R.id.tvHello);
            Log.i(LOG_TAG, "I'm here");
            config = new ConnectionConfiguration("prc.p1.im", 5222, "prc.p1.im");
            connection = new XMPPConnection(config);
            try {
                connection.connect();
                // tvHello.setText("Connected to XMPP server");
                Log.i(LOG_TAG, "Successfully Connected");
            } catch (XMPPException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Log.e(LOG_TAG, "Not Connected");
            }
        }
    }

Журналы LogCat:

12-22 15:58:16.319: E/dalvikvm(828): Could not find class 'org.jivesoftware.smack.ConnectionConfiguration', referenced from method com.test.mypro.TestProjectActivity.onCreate
12-22 15:58:16.339: W/dalvikvm(828): VFY: unable to resolve new-instance 26 (Lorg/jivesoftware/smack/ConnectionConfiguration;) in Lcom/test/mypro/TestProjectActivity;
12-22 15:58:16.339: D/dalvikvm(828): VFY: replacing opcode 0x22 at 0x0019
12-22 15:58:16.351: D/dalvikvm(828): VFY: dead code 0x001b-0047 in Lcom/test/mypro/TestProjectActivity;.onCreate (Landroid/os/Bundle;)V
12-22 15:58:16.509: I/TESTER(828): I'm here
12-22 15:58:16.519: D/AndroidRuntime(828): Shutting down VM
12-22 15:58:16.519: W/dalvikvm(828): threadid=1: thread exiting with uncaught exception (group=0x40015560)
12-22 15:58:16.561: E/AndroidRuntime(828): FATAL EXCEPTION: main
12-22 15:58:16.561: E/AndroidRuntime(828): java.lang.NoClassDefFoundError: org.jivesoftware.smack.ConnectionConfiguration
12-22 15:58:16.561: E/AndroidRuntime(828):  at com.test.mypro.TestProjectActivity.onCreate(TestProjectActivity.java:24)
12-22 15:58:16.561: E/AndroidRuntime(828):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
12-22 15:58:16.561: E/AndroidRuntime(828):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
12-22 15:58:16.561: E/AndroidRuntime(828):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
12-22 15:58:16.561: E/AndroidRuntime(828):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
12-22 15:58:16.561: E/AndroidRuntime(828):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
12-22 15:58:16.561: E/AndroidRuntime(828):  at android.os.Handler.dispatchMessage(Handler.java:99)
12-22 15:58:16.561: E/AndroidRuntime(828):  at android.os.Looper.loop(Looper.java:123)
12-22 15:58:16.561: E/AndroidRuntime(828):  at android.app.ActivityThread.main(ActivityThread.java:3683)
12-22 15:58:16.561: E/AndroidRuntime(828):  at java.lang.reflect.Method.invokeNative(Native Method)
12-22 15:58:16.561: E/AndroidRuntime(828):  at java.lang.reflect.Method.invoke(Method.java:507)
12-22 15:58:16.561: E/AndroidRuntime(828):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
12-22 15:58:16.561: E/AndroidRuntime(828):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
12-22 15:58:16.561: E/AndroidRuntime(828):  at dalvik.system.NativeStart.main(Native Method)

Дополнительная информация: у меня импортирована библиотека asmack-android-7.jar. Мой AVD работает под управлением Android 2.3.3.

Я предполагаю, что из-за этого я получаю фатальное исключение. Что мне здесь не хватает? Ваша помощь будет оценена по достоинству. Спасибо.


person harsh8888    schedule 22.12.2012    source источник


Ответы (3)


public class ChatScreen extends Activity implements android.view.View.OnClickListener { 

private final static String SERVER_HOST = "192.168.88.158";
private final static int SERVER_PORT = 5222;
private final static String SERVICE_NAME = "192.168.88.158";
private final static String LOGIN = "manish";
private final static String PASSWORD = "android";
private List<String> m_discussionThread;
private ArrayAdapter<String> m_discussionThreadAdapter;
private XMPPConnection m_connection;
private Handler m_handler;
public static  ArrayList<HashMap<String, String>> usersList;
Presence presence;
ListView list;
int position = 0;

private Button BackBtn;
private Button EndChatBtn;
TextView opretor;
    String opretorName;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.chat_screen);
    usersList=new ArrayList<HashMap<String, String>>();
    Intent intent = getIntent();
    opretorName = intent.getStringExtra("opName");
    opretor = (TextView) findViewById(R.id.Opretor1);
    opretor.setText(opretorName);
            m_handler = new Handler();
    try {
        initConnection();
    } catch (XMPPException e) {
        e.printStackTrace();
    }
    final EditText recipient = (EditText) this.findViewById(R.id.recipient);
    recipient.setText(opretorName + "@manishsys-pc");
    final EditText message = (EditText) this.findViewById(R.id.message);        
    list = (ListView) this.findViewById(R.id.thread);

    m_discussionThread = new ArrayList<String>();
    m_discussionThreadAdapter = new ArrayAdapter<String>(this,
            R.layout.multi_line_list_item, m_discussionThread);
    list.setAdapter(m_discussionThreadAdapter);

    Button send = (Button) this.findViewById(R.id.send);
    send.setOnClickListener(new View.OnClickListener() {
        @SuppressLint("SimpleDateFormat")
        public void onClick(View view) {
            String to = recipient.getText().toString();
            String text = message.getText().toString();

            Message msg = new Message(to, Message.Type.chat);
            Calendar c = Calendar.getInstance(); 
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy MMMM d, hh:mm a");
            String strdt= formatter.format(c.getTime());
            msg.setBody(text);
            m_connection.sendPacket(msg);
            m_discussionThread.add("me :" + strdt);
            m_discussionThread.add(text);
            m_discussionThreadAdapter.notifyDataSetChanged();

        }
    });

    BackBtn = (Button) findViewById(R.id.ChatBackBtn);
    BackBtn.setOnClickListener(this);
    EndChatBtn= (Button) findViewById(R.id.EndChatBtn);
    EndChatBtn.setOnClickListener(this);

}

private void initConnection() throws XMPPException {
    //Initialisation de la connexion
    ConnectionConfiguration config =
            new ConnectionConfiguration(SERVER_HOST, SERVER_PORT, SERVICE_NAME );
    m_connection = new XMPPConnection(config);
    m_connection.connect();
    m_connection.login(LOGIN, PASSWORD);
    presence = new Presence(Presence.Type.available);
    m_connection.sendPacket(presence);

    //Get all userList
    Roster roster = m_connection.getRoster();
    String[] urlArray = new String[] { "office" };
    roster.createEntry("ravi", "ravi", urlArray);
    Collection<RosterEntry> entries = roster.getEntries();

    for(RosterEntry entry : entries) {
        HashMap<String, String> map = new HashMap<String, String>();
        presence = roster.getPresence(entry.getUser());

        Presence.Type type = presence.getType();       

        map.put("USER", entry.getName().toString());
        map.put("STATUS", type.toString());
        Log.e("USER", entry.getName().toString());

        usersList.add(map);
    }

 // Assume we've created a Connection name "connection".
    ChatManager chatmanager = m_connection.getChatManager();
    Chat newChat = chatmanager.createChat("mansih@manishsys-pc ", new MessageListener() {
        public void processMessage(Chat chat, Message message) {
            System.out.println("Received message: " + message);
        }
    });

    try {
        newChat.sendMessage("Howdy!");
    }
    catch (XMPPException e) {
        System.out.println("Error Delivering block");
    }

    //enregistrement de l'écouteur de messages
    PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
    m_connection.addPacketListener(new PacketListener() {
            @SuppressLint("SimpleDateFormat")
            public void processPacket(Packet packet) {
                Message message = (Message) packet;
                if (message.getBody() != null) {
                    String fromName = StringUtils.parseBareAddress(message
                            .getFrom());
                    Calendar c = Calendar.getInstance(); 
                    SimpleDateFormat formatter = new SimpleDateFormat("yyyy MMMM d, hh:mm a");
                    String strdt= formatter.format(c.getTime());
                    m_discussionThread.add(fromName + ":" + strdt);
                    m_discussionThread.add(message.getBody());

                    m_handler.post(new Runnable() {
                        public void run() {
                            list.smoothScrollToPosition(list.getCount()-1);
                            m_discussionThreadAdapter.notifyDataSetChanged();
                        }
                    });
                }
            }
        }, filter);
    }
}
@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()) {
    case R.id.ChatBackBtn:

        Intent BackIntent = new Intent(ChatScreen.this,
                OperatorScreen.class);
        BackIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(BackIntent);
        ChatScreen.this.finish();

        break;
    case R.id.EndChatBtn:

        Intent EndChtIntent = new Intent(ChatScreen.this,
                RatingScreen.class);
        EndChtIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(EndChtIntent);
        ChatScreen.this.finish();

        break;

    default:
        break;`
    }
  }
}

это мой код, он отлично работает для меня, я надеюсь, что он будет полезен для вас. Спасибо

person Manish Sindhal    schedule 04.04.2014

попробуй это

private final static String server_host = "talk.google.com";
private final static int SERVER_PORT = 5222;
private final static String SERVICE_NAME = "gmail.com";

ConnectionConfiguration config = new ConnectionConfiguration( server_host, SERVER_PORT , SERVICE_NAME);
        XMPPConnection m_connection = new XMPPConnection(config);
                try {
                     SASLAuthentication.supportSASLMechanism("PLAIN");
                     config.setSASLAuthenticationEnabled(true);     
                     m_connection.connect();
                    Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.manual);
                } catch (XMPPException e) {
                    e.printStackTrace();
                }       
person NagarjunaReddy    schedule 22.12.2012
comment
Я думаю, вы не видели лог должным образом. Основная проблема, которую вы должны отметить в журнале, заключается в следующем: «Не удалось найти класс» org.jivesoftware.smack.ConnectionConfiguration, на который ссылается метод com.test.mypro.TestProjectActivity.onCreate. Я не могу вызвать класс CONnectionConfiguration. Тем не менее я попробовал ваш код, получив тот же результат - person harsh8888; 22.12.2012
comment
Пожалуйста, проверьте журнал. Проблема где-то заключается в импорте библиотеки, которую я предполагаю (первая строка журнала). Он не может вытащить класс ConnectionConfiguration, который инициирует дальнейший процесс подключения, поэтому размещение его в отдельном методе не должно иметь никакого значения. Какие-либо предложения? - person harsh8888; 22.12.2012
comment
Спасибо, Нагарджуна, за ваше время и ответы. Я разместил соответствующий ответ, и проблема решена. - person harsh8888; 22.12.2012
comment
посмотрите здесь, как библиотека asmack работает отлично .google.com/p/asmack/downloads/ - person NagarjunaReddy; 22.12.2012

Я нашел решение этой проблемы. Это было связано с обновлением, которое я сделал для API. Я удалил импортированную библиотеку ASmack из свойства своего проекта. Папка Lib тоже отсутствовала. Поэтому я создал одну папку («libs») в проекте и вставил туда банку ASmack. Очистив проект один раз, ошибка была исправлена. Спасибо. Справочник

person harsh8888    schedule 22.12.2012
comment
Пожалуйста, не давайте только ссылку на решение. Вместо этого опишите здесь, что помогло вам решить проблему. - person Flow; 22.12.2012
comment
Я добавил детали в решение. Спасибо. - person harsh8888; 23.12.2012