2013-06-06 4 views
3

Я сделал это как можно проще в коде. Я использую asmack library для android в версии 8-0.8.3.Попытка подключиться к XMPP-серверу с помощью aSmack на Android дает мне «no dns resolver active»

Мой код:

package info.zajacmp3.servercommunication; 

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

import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 

public class XmppService extends Service{ 



    public void xmppService() throws XMPPException { 

     Connection conn1 = new XMPPConnection("jabber.org"); 
     conn1.connect(); 
    } 


    @Override 
    public void onCreate(){ 
     //TODO:actions to perform when service is created 
     try { 
      xmppService(); 
     } catch (XMPPException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Replace with service binding 
     return null; 
    } 
} 

Это заморозить мое приложение и вызвать меня и ошибка: нет разрешения DNS активен. В Интернете нет ничего об этом.

Я действительно надеюсь получить помощь или подсказки.

также пытался так:

частного конечного статического Струнный server_host = "Jabber.org"; закрытый конечный статический int SERVER_PORT = 5222;

общественного недействительными XMPPService() бросает XMPPException {

ConnectionConfiguration config = new ConnectionConfiguration(server_host, SERVER_PORT); 
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(); 
     } 

}

@UPDATE:

Использование привкусом библиотеки вместо asmack получает меня такая же проблема. я не получаю журнал ошибок, но после отключения отладчика я получаю:

enter image description here

+0

Checkout обновленный ответ. – amrinder007

ответ

2

Я рекомендую использовать Смак вместо aSmack. Asmack - это исправленная и улучшенная версия Smack, а aSmack несколько мертв. В Smack code refactoring делается, добавлены некоторые новые методы и реорганизованные классы DNS.

Смотрите эту Smack

UPDATE
После просмотра войти ваша ошибка это, кажется, проблема сетевого вызова на главном потоке пользовательского интерфейса

Как разрешить NetworkOnMainThread исключение?
Используйте AsyncTask, который делает ваш сетевой вызов в другом потоке (в фоновом режиме), а не в основном потоке приложения.

Переместить ваш код AsynTask: -

private class ConnectToXmpp extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 
      ConnectionConfiguration config = new ConnectionConfiguration(server_host, SERVER_PORT); 
      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(); 
    } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 

    } 

} 

И теперь вы можете выполнить свой AsyncTask: -

new ConnectToXmpp().execute(); 

С помощью этого сетевого вызова будет производиться в фоновом режиме в другом потоке.

Смотрите эту AsyncTask

+0

Большое спасибо за ваш интерес к этому вопросу @ amrinder007. Я пробовал и возвращался в самую новую версию. Я получаю ту же ошибку. Я обновил тему этой ошибкой –

+2

Что заставляет вас думать, что [aSmack] (http://asmack.org) мертв? Недавно был выпущен только несколько недель назад. И smack не будет работать на Android без изменений, поэтому aSmack существует. Подробнее о aSmack можно прочитать здесь: http://community.ignitrealtime.org/message/226881#226881 – Flow

+1

Asmack не мертв, но его beaning поддерживается @Flow. – dhams

6

Если aSmack говорит вам, что ни один DNS распознаватель не активна, то вы, скорее всего, не инициализировать статический код aSmack, как aSmack's README сказал вам делать.

Из README

In order to work correctly on Android, you need to register Smack's XMPP Providers and Extensions manually and init some static code blocks before you doing any XMPP activty. Calling SmackAndroid.init(Context) (in org.jivesoftware.smack) will do this for you.

Просто позвоните SmackAndroid.init(Context) и вы прекрасно.

1

Это работает для меня:

  int portInt = 5222; 
      String host = "192.168.0.104"; 
      String service = "something.local" //Domain name 
      String username = "username" //Without domain name 
      String password = "password" 

      // Create a connection 
      ConnectionConfiguration connConfig = new ConnectionConfiguration(host, portInt,service); 
      connConfig.setSASLAuthenticationEnabled(true); 
      //connConfig.setCompressionEnabled(true); 
      connConfig.setSecurityMode(SecurityMode.enabled); 

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
       connConfig.setTruststoreType("AndroidCAStore"); 
       connConfig.setTruststorePassword(null); 
       connConfig.setTruststorePath(null); 
       Log.i("XMPP", "Build Icecream"); 

      } else { 
       connConfig.setTruststoreType("BKS"); 
       String path = System.getProperty("javax.net.ssl.trustStore"); 
       if (path == null) 
        path = System.getProperty("java.home") + File.separator + "etc" 
          + File.separator + "security" + File.separator 
          + "cacerts.bks"; 
       connConfig.setTruststorePath(path); 
       Log.i("XMPP", "Build less than Icecream "); 

      } 
      connConfig.setDebuggerEnabled(true); 
      XMPPConnection.DEBUG_ENABLED = true; 
      XMPPConnection connection = new XMPPConnection(connConfig); 

      try { 
       connection.connect(); 
       Log.i("XMPP", "Connected to " + connection.getHost()); 
       // publishProgress("Connected to host " + HOST); 
      } catch (XMPPException ex) { 
       Log.e("XMPP", "Failed to connect to " + connection.getHost()); 
       Log.e("XMPP", ex.toString()); 
       //publishProgress("Failed to connect to " + HOST); 
       //xmppClient.setConnection(null); 
      } 

      try { 
       connection.login(username, password); 
       Log.i("androxmpp", "Logged in " + connection.getUser() + ". Authenticated : "+connection.isAuthenticated()); 
      } catch(Exception ex){ 

       Log.i("androxmpp", "Login Unsuccessfull "); 
       ex.printStackTrace(); 
      } 
Смежные вопросы