[英]Cannot Make Login Work in Smack and Openfire
我一直在关注我在 GitHub 上找到的本教程,以尝试连接到 OpenFire 服务器。 我以前使用过 spark,现在正在尝试使用 Smack api 创建一个简单的 android 应用程序,以便在旅途中使用。 我遵循了一些教程,最终从 Github 偶然发现了这个: https : //github.com/axcl/SMACK-API-Android-Demo
问题是当我单击登录按钮时,我在 OpenFire 管理员面板中看不到我的在线状态。
这是代码: Myxmpp.java
public class Myxmpp {
private static final String DOMAIN = "192.168.2.14";
private static final String HOST = "192.168.2.14";
private static final int PORT = 5222;
private String userName ="";
private String passWord = "";
AbstractXMPPConnection connection ;
ChatManager chatmanager ;
Chat newChat;
XMPPConnectionListener connectionListener = new XMPPConnectionListener();
private boolean connected;
private boolean isToasted;
private boolean chat_created;
private boolean loggedin;
//Initialize
public void init(String userId,String pwd ) {
Log.i("XMPP", "Initializing!");
this.userName = userId;
this.passWord = pwd;
XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
configBuilder.setUsernameAndPassword(userName, passWord);
configBuilder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
configBuilder.setResource("Android");
configBuilder.setServiceName(DOMAIN);
configBuilder.setHost(HOST);
configBuilder.setPort(PORT);
//configBuilder.setDebuggerEnabled(true);
connection = new XMPPTCPConnection(configBuilder.build());
connection.addConnectionListener(connectionListener);
}
// Disconnect Function
public void disconnectConnection(){
new Thread(new Runnable() {
@Override
public void run() {
connection.disconnect();
}
}).start();
}
public void connectConnection()
{
AsyncTask<Void, Void, Boolean> connectionThread = new AsyncTask<Void, Void, Boolean>() {
@Override
protected Boolean doInBackground(Void... arg0) {
// Create a connection
try {
connection.connect();
login();
connected = true;
} catch (IOException e) {
} catch (SmackException e) {
} catch (XMPPException e) {
}
return null;
}
};
connectionThread.execute();
}
public void sendMsg() {
if (connection.isConnected()== true) {
// Assume we've created an XMPPConnection name "connection"._
chatmanager = ChatManager.getInstanceFor(connection);
newChat = chatmanager.createChat("concurer@nimbuzz.com");
try {
newChat.sendMessage("Howdy!");
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
}
}
}
public void login() {
try {
connection.login(userName, passWord);
//Log.i("LOGIN", "Yey! We're connected to the Xmpp server!");
} catch (XMPPException | SmackException | IOException e) {
e.printStackTrace();
} catch (Exception e) {
}
}
//Connection Listener to check connection state
public class XMPPConnectionListener implements ConnectionListener {
@Override
public void connected(final XMPPConnection connection) {
Log.d("xmpp", "Connected!");
connected = true;
if (!connection.isAuthenticated()) {
login();
}
}
@Override
public void connectionClosed() {
if (isToasted)
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
Log.d("xmpp", "ConnectionCLosed!");
connected = false;
chat_created = false;
loggedin = false;
}
@Override
public void connectionClosedOnError(Exception arg0) {
if (isToasted)
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
}
});
Log.d("xmpp", "ConnectionClosedOn Error!");
connected = false;
chat_created = false;
loggedin = false;
}
@Override
public void reconnectingIn(int arg0) {
Log.d("xmpp", "Reconnectingin " + arg0);
loggedin = false;
}
@Override
public void reconnectionFailed(Exception arg0) {
if (isToasted)
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
}
});
Log.d("xmpp", "ReconnectionFailed!");
connected = false;
chat_created = false;
loggedin = false;
}
@Override
public void reconnectionSuccessful() {
if (isToasted)
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
Log.d("xmpp", "ReconnectionSuccessful");
connected = true;
chat_created = false;
loggedin = false;
}
@Override
public void authenticated(XMPPConnection arg0, boolean arg1) {
Log.d("xmpp", "Authenticated!");
loggedin = true;
chat_created = false;
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
if (isToasted)
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
}
}
}
连接Xmpp.java
public class ConnectXmpp extends Service {
private String userName;
private String passWord;
private Myxmpp xmpp = new Myxmpp();
public ConnectXmpp() {
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return new Localbinder<ConnectXmpp>(this);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
if(intent != null){
userName = intent.getStringExtra("user");
passWord = intent.getStringExtra("pwd");
xmpp.init(userName, passWord);
xmpp.connectConnection();
}
return 0;
}
@Override
public void onDestroy() {
xmpp.disconnectConnection();
super.onDestroy();
}
主要活动
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private ConnectXmpp mService;
private View view;
private boolean mBounded;
private final ServiceConnection mConnection = new ServiceConnection() {
@SuppressWarnings("unchecked")
@Override
public void onServiceConnected(final ComponentName name,
final IBinder service) {
mService = ((Localbinder<ConnectXmpp>) service).getService();
mBounded = true;
Log.d(TAG, "onServiceConnected");
}
@Override
public void onServiceDisconnected(final ComponentName name) {
mService = null;
mBounded = false;
Log.d(TAG, "onServiceDisconnected");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
//Click Handler for Login Button
public void onClickLoginBtn(View view)
{
try {
EditText userId = (EditText) findViewById(R.id.username);
EditText userPwd = (EditText) findViewById(R.id.password);
String userName = userId.getText().toString();
String passWord = userPwd.getText().toString();
Intent intent = new Intent(getBaseContext(),ConnectXmpp.class );
intent.putExtra("user",userName);
intent.putExtra("pwd",passWord);
startService(intent);
//mService.connectConnection(intent);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
我知道这很多,但我真的对整个 XMPP 的东西感到困惑。 任何有关如何连接已注册用户的帮助将不胜感激。 谢谢
您好,我已经检查了您的代码,您确定您的域名和主机名相同吗? 根据您的问题,您无法使用应用程序使用 xmpp 登录。
试试这个 github 示例。这让我很受用。所以如果你有任何问题,我可以帮助你。
https://github.com/saveendhiman/XMPPSample_Studio
谢谢你希望这会帮助你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.