Intentar conectarme al servidor XMPP con aSmack en Android me da "no dns resolver active"
(3)
Hice esto tan simple como puedo en el código. Estoy usando la biblioteca asmack para Android en la versión 8-0.8.3.
Mi código:
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;
}
}
Congela mi aplicación y me causa un error: no hay resolución de DNS activa. No hay nada en la web sobre eso.
Realmente espero obtener ayuda o pistas.
También intenté así:
private final static String server_host = "jabber.org"; private final static int SERVER_PORT = 5222;
public void xmppService () lanza 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();
}
}
@ACTUALIZAR:
Usar la biblioteca smack en lugar de asmack me da el mismo problema. No recibo ningún registro de errores, pero después de desconectar el depurador obtengo:
Si aSmack le dice que no hay una resolución de DNS activa, lo más probable es que no haya inicializado el código estático de aSmack como lo indicó un README de aSmack .
Del README
Para funcionar correctamente en Android, debe registrar las Extensiones y Proveedores XMPP de Smack manualmente e iniciar algunos bloques de código estático antes de realizar cualquier actividad XMPP. Llamar a SmackAndroid.init (Context) (en org.jivesoftware.smack) hará esto por usted.
Simplemente llame a SmackAndroid.init(Context)
y SmackAndroid.init(Context)
bien.
Recomiendo usar Smack en lugar de aSmack. Asmack es una versión mejorada y parcheada de Smack y aSmack está algo muerto. En la refactorización de código de Smack, se han agregado algunos métodos nuevos y se han modificado las clases de DNS.
Ver este Smack
ACTUALIZAR
Después de ver su registro de error parece ser el problema de la llamada de red en el hilo de la interfaz de usuario principal
¿Cómo resolver la excepción NetworkOnMainThread?
Use AsyncTask, que hace que su red invoque un hilo diferente (en segundo plano) en lugar del hilo principal de la aplicación.
Mueva su código a 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) {
}
}
Y ahora puedes ejecutar tu AsyncTask: -
new ConnectToXmpp().execute();
Con esto, su llamada a la red se realizará en segundo plano en diferentes hilos.
Ver esta AsyncTask
Esto funciona para mí:
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();
}