无法使用xmpp本地服务器从android客户端发送ans接收消息?
我想为本地服务器连接构建XMPP android客户端,该客户端将能够随实时视频聊天一起发送文本。所以最初我尝试制作一个简单的聊天应用程序。使用此应用程序,我可以看到所有可用的用户,但当我尝试发送消息时,它无法到达服务器或其他客户端。谁能帮我找出问题出在哪里 聊天活动:无法使用xmpp本地服务器从android客户端发送ans接收消息?,android,xmpp,xmppframework,Android,Xmpp,Xmppframework,我想为本地服务器连接构建XMPP android客户端,该客户端将能够随实时视频聊天一起发送文本。所以最初我尝试制作一个简单的聊天应用程序。使用此应用程序,我可以看到所有可用的用户,但当我尝试发送消息时,它无法到达服务器或其他客户端。谁能帮我找出问题出在哪里 聊天活动: public class ChatActivity extends Activity { private static final int REQUEST_CODE_FOR_GALLERY = 1; private stati
public class ChatActivity extends Activity {
private static final int REQUEST_CODE_FOR_GALLERY = 1;
private static final int REQUEST_CODE_FOR_FILEMANAGER = 2;
private static String LOG_TAG = "- Chat Activity -";
private Context context;
private ListView chatListView;
private Button attatchmentButton;
private Button sendButton;
private EditText chatMessageEditText;
private ArrayList<ChatEntry> chatEntries;
private ChatAdapter chatAdapter;
private String fJID, fNickName;
private String mJID, mNickName;
private byte[] fAvatarByte, mAvatarByte;
private Bitmap fAvatarBitmap, mAvatarBitmap;
private XMPPConnection xmppConnection;
private FileTransferManager receiveFileManager;
private FileTransferManager sendFileManager;
private FileTransferListener listener;
private File externalStorageDirectory;
private String fileSrc;
private Handler sHandler, rHandler;
private Thread sThread;
private File rfile;
private LinearLayout layoutReceivingFile;
private LinearLayout layoutSendinfFile;
private ProgressBar rProgressBar;
private ProgressBar sProgressBar;
private ChatManager chatManager;
private Chat chat;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_chat);
// Context
context = this;
// View matching
chatListView = (ListView) findViewById(R.id.chat_message_listview);
attatchmentButton = (Button) findViewById(R.id.chat_attatchment_button);
sendButton = (Button) findViewById(R.id.chat_send_button);
chatMessageEditText = (EditText) findViewById(R.id.chat_message_edit_text);
layoutReceivingFile = (LinearLayout) findViewById(R.id.chat_file_transfer_receive_layout);
layoutSendinfFile = (LinearLayout) findViewById(R.id.chat_file_transfer_send_layout);
rProgressBar = (ProgressBar) findViewById(R.id.chat_receive_file_progress_bar);
sProgressBar = (ProgressBar) findViewById(R.id.chat_send_file_progress_bar);
// Event for attachment button
attatchmentButton.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("File attachment");
builder.setMessage("Choose your file type.");
builder.setNegativeButton("Picture", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, REQUEST_CODE_FOR_GALLERY);
}
});
builder.setPositiveButton("File", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(ChatActivity.this, FilePickerActivity.class);
ArrayList<String> extensions = new ArrayList<String>();
extensions.add(".png");
extensions.add(".jpg");
extensions.add(".gif");
extensions.add(".tif");
extensions.add(".bmp");
extensions.add(".doc");
extensions.add(".docx");
extensions.add(".ppt");
extensions.add(".pptx");
extensions.add(".xls");
extensions.add(".xlsx");
extensions.add(".pdf");
extensions.add(".zip");
extensions.add(".rar");
intent.putExtra(FilePickerActivity.EXTRA_ACCEPTED_FILE_EXTENSIONS, extensions);
startActivityForResult(intent, REQUEST_CODE_FOR_FILEMANAGER);
}
});
builder.setCancelable(true);
AlertDialog alertDialog = builder.create();
alertDialog.show();
}
});
// Event for send message button
sendButton.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
String message = chatMessageEditText.getText().toString();
if ( message.trim().length() == 0 ) {
Toast.makeText(context, "Please fill up some text.", Toast.LENGTH_SHORT).show();
} else {
try {
chat.sendMessage(message);
chatMessageEditText.setText(null);
Log.d(LOG_TAG, "Trying to send message 1");
Toast.makeText(context, "trying to send" +message.toString(), Toast.LENGTH_LONG).show();
ChatEntry chatEntry = new ChatEntry();
chatEntry.setAttachedFile(false);
chatEntry.setFilePath(null);
chatEntry.setSenderJID(mJID);
chatEntry.setReceiverJID(fJID);
chatEntry.setSenderAvatarBitmap(mAvatarBitmap);
chatEntry.setWhen(System.currentTimeMillis());
chatEntry.setMessage(message);
Log.d(LOG_TAG, "Trying to send message 2");
chatEntries.add(chatEntry);
chatAdapter.setData(chatEntries);
chatAdapter.notifyDataSetChanged();
chatListView.setSelection(chatEntries.size()-1);
Log.d(LOG_TAG, "Trying to send message 3");
} catch (XMPPException e) {
Log.e(LOG_TAG, "Unable to send message: "+e.getMessage());
}
}
}
});
// Event for chat list view
chatListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> adapterView, View view, int position, long which) {
if ( chatEntries.get(position).isAttachedFile() ) {
File file = new File(chatEntries.get(position).getFilePath());
if ( isImageFile(file) ) {
Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "image/*");
startActivity(intent);
} else {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.fromFile(file));
startActivity(intent);
}
}
}
});
// Extras
Bundle bundle = getIntent().getExtras();
if ( bundle == null ) {
ChatActivity.this.finish();
} else {
// Get active connection
xmppConnection = MainActivity.getXMPPConnection();
if ( xmppConnection == null ) {
ChatActivity.this.finish();
} else {
// For BEEM
FileTransferNegotiator.IBB_ONLY = true;
// -- END OF FOR BEEM
// Enable Server Discovery Manager
ServiceDiscoveryManager sdm = new ServiceDiscoveryManager(xmppConnection);
// sdm.addFeature("http://jabber.org/protocol/ibb");
// FOR BEEM
sdm.addFeature("http://jabber.org/protocol/disco#info");
sdm.addFeature("http://jabber.org/protocol/disco#item");
sdm.addFeature("jabber:iq:privacy");
// -- END OF FOR BEEM
// Receive data from extras
fJID = bundle.getString("fJID");
fJID += "/"+ApplicationSetting.SERVER_RESOURCE;
fNickName = bundle.getString("fNickName");
fAvatarByte = bundle.getByteArray("fAvatarByte");
fAvatarBitmap = BitmapUtility.convertByteArrayToBitmap(fAvatarByte);
mJID = bundle.getString("mJID");
mNickName = bundle.getString("mNickName");
mAvatarByte = bundle.getByteArray("mAvatarByte");
mAvatarBitmap = BitmapUtility.convertByteArrayToBitmap(mAvatarByte);
Toast.makeText(context, "fjid is "+fJID + "mjid is "+mJID, Toast.LENGTH_LONG).show();
// Initialize
chatMessageEditText.setSingleLine(true);
chatEntries = new ArrayList<ChatEntry>();
chatAdapter = new ChatAdapter(context, chatEntries, mJID);
chatListView.setAdapter(chatAdapter);
chatListView.setDivider(null);
fileSrc = null;
rProgressBar.setMax(100);
sProgressBar.setMax(100);
sProgressBar.setClickable(false);
rProgressBar.setClickable(false);
layoutReceivingFile.setVisibility(View.GONE);
layoutSendinfFile.setVisibility(View.GONE);
// Set title for this activity
setTitle("Chat with "+fNickName);
Log.i(LOG_TAG, mNickName+" chat with "+fNickName);
// Create Chat Manager
chatManager = xmppConnection.getChatManager();
// Add Chat Listener
chatManager.addChatListener(new ChatManagerListener() {
public void chatCreated(Chat chat, boolean isCreated) {
Toast.makeText(context, "Chat was created.", Toast.LENGTH_LONG).show();
Log.i(LOG_TAG, "Chat was created.");
}
});
// Create chat channel with friend
final Handler chatHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch ( msg.what ) {
case 1:
org.jivesoftware.smack.packet.Message chatMessage;
chatMessage = (org.jivesoftware.smack.packet.Message) msg.obj;
Toast.makeText(context, "Chat message." +msg.toString(), Toast.LENGTH_LONG).show();
ChatEntry chatEntry = new ChatEntry();
chatEntry.setAttachedFile(false);
chatEntry.setFilePath(null);
chatEntry.setSenderJID(fJID);
chatEntry.setReceiverJID(mJID);
chatEntry.setSenderAvatarBitmap(fAvatarBitmap);
chatEntry.setWhen(System.currentTimeMillis());
chatEntry.setMessage(chatMessage.getBody());
chatEntries.add(chatEntry);
chatAdapter.setData(chatEntries);
chatAdapter.notifyDataSetChanged();
chatListView.setSelection(chatEntries.size()-1);
break;
}
}
};
chat = chatManager.createChat(fJID, new MessageListener() {
public void processMessage(Chat chat, final org.jivesoftware.smack.packet.Message chatMessage) {
Toast.makeText(context, "chatManager.createChat(fJID, new MessageListener() " , Toast.LENGTH_LONG).show();
if ( chatMessage.getBody() != null ) {
new Thread() {
public void run() {
Message msg = new Message();
msg.what = 1;
msg.obj = chatMessage;
Toast.makeText(context, "Chat message.before chathandler" +msg.toString(), Toast.LENGTH_LONG).show();
chatHandler.sendMessage(msg);
};
}.start();
Log.i(LOG_TAG, "Received message from: "+chatMessage.getFrom()+": "+chatMessage.getBody());
}
}
});
// Setup file transfer manager
receiveFileManager = new FileTransferManager(xmppConnection);
sendFileManager = new FileTransferManager(xmppConnection);
// Setup default saving directory ('mychat' on sd card)
externalStorageDirectory = new File(Environment.getExternalStorageDirectory(), "mychat");
// Setup handler for receive file listener
rHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch ( msg.what ) {
case 0:
// Finish with error
layoutReceivingFile.setVisibility(View.GONE);
Toast.makeText(context, "Unable to receive file.", Toast.LENGTH_LONG).show();
break;
case 1:
// Finish with complete
layoutReceivingFile.setVisibility(View.GONE);
Toast.makeText(context, "You have received new file.", Toast.LENGTH_LONG).show();
ChatEntry chatEntry = new ChatEntry();
chatEntry.setAttachedFile(true);
chatEntry.setFilePath(rfile.getAbsolutePath());
chatEntry.setSenderJID(fJID);
chatEntry.setReceiverJID(mJID);
chatEntry.setSenderAvatarBitmap(fAvatarBitmap);
chatEntry.setWhen(System.currentTimeMillis());
chatEntry.setMessage("You just received an attachment.");
chatEntries.add(chatEntry);
chatAdapter.setData(chatEntries);
chatAdapter.notifyDataSetChanged();
chatListView.setSelection(chatEntries.size()-1);
break;
case 2:
// Streaming
layoutReceivingFile.setVisibility(View.VISIBLE);
break;
}
}
};
// Setup receive file listener
listener = new FileTransferListener() {
public void fileTransferRequest(final FileTransferRequest request) {
Log.i(LOG_TAG, "Receive file coming");
new Thread() {
public void run() {
IncomingFileTransfer transfer = request.accept();
rfile = new File(externalStorageDirectory, transfer.getFileName());
try {
transfer.recieveFile(rfile);
Log.i(LOG_TAG, "Start receive file.");
while ( !transfer.isDone() ) {
try {
sleep(1000);
int percent = (int)(transfer.getProgress()*100);
if ( percent == 100 ) {
rProgressBar.setProgress(0);
} else {
rProgressBar.setProgress(percent);
}
Log.i(LOG_TAG, "Receiving file: "+percent+" %");
rHandler.sendEmptyMessage(2);
} catch ( InterruptedException e ) {
e.printStackTrace();
Log.e(LOG_TAG, "Receiving thread was interrupoted: "+e.getMessage());
}
}
if ( transfer.getStatus().equals(Status.complete) ) {
rHandler.sendEmptyMessage(1);
Log.i(LOG_TAG, "Receive file Completed.");
} else if ( transfer.getStatus().equals(Status.cancelled) ) {
rHandler.sendEmptyMessage(0);
Log.e(LOG_TAG, "Receive file Cancelled.");
} else if ( transfer.getStatus().equals(Status.error) ) {
rHandler.sendEmptyMessage(0);
Log.e(LOG_TAG, "Receive file Error.");
} else if ( transfer.getStatus().equals(Status.refused) ) {
rHandler.sendEmptyMessage(0);
Log.e(LOG_TAG, "Receive file Refused.");
}
} catch ( Exception e ) {
Log.e(LOG_TAG, "Unable to receive file: "+e.getMessage());
}
};
}.start();
}
};
// Add receive file listener
receiveFileManager.addFileTransferListener(listener);
}
}
}
// Send file
public void sendFile(final File file) {
sHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch ( msg.what ) {
case 0:
// Finish with error
layoutSendinfFile.setVisibility(View.GONE);
Toast.makeText(context, "Unable to send file.", Toast.LENGTH_LONG).show();
break;
case 1:
// Finish with complete
layoutSendinfFile.setVisibility(View.GONE);
Toast.makeText(context, "Your file has been sent.", Toast.LENGTH_LONG).show();
ChatEntry chatEntry = new ChatEntry();
chatEntry.setAttachedFile(true);
chatEntry.setFilePath(fileSrc);
chatEntry.setSenderJID(mJID);
chatEntry.setReceiverJID(fJID);
chatEntry.setSenderAvatarBitmap(mAvatarBitmap);
chatEntry.setWhen(System.currentTimeMillis());
chatEntry.setMessage("Your attachment has been sent.");
chatEntries.add(chatEntry);
chatAdapter.setData(chatEntries);
chatAdapter.notifyDataSetChanged();
chatListView.setSelection(chatEntries.size()-1);
break;
case 2:
// Streaming
layoutSendinfFile.setVisibility(View.VISIBLE);
break;
}
}
};
sThread = new Thread() {
@Override
public void run() {
Log.i(LOG_TAG, "Send file coming");
OutgoingFileTransfer transfer = sendFileManager.createOutgoingFileTransfer(fJID);
try {
transfer.sendFile(file, "iChat-attachment-file");
Log.i(LOG_TAG, "Starting send file");
while ( !transfer.isDone() ) {
try {
sleep(1000);
int percent = (int)(transfer.getProgress()*100);
if ( percent == 100 ) {
sProgressBar.setProgress(0);
} else {
sProgressBar.setProgress(percent);
}
Log.i(LOG_TAG, "Sending file: "+percent+" %");
sHandler.sendEmptyMessage(2);
} catch (InterruptedException e) {
e.printStackTrace();
Log.e(LOG_TAG, "Send file thread was interrupted: "+e.getMessage());
}
}
if ( transfer.getStatus().equals(Status.complete) ) {
sHandler.sendEmptyMessage(1);
Log.i(LOG_TAG, "Send file is completed");
} else {
sHandler.sendEmptyMessage(0);
Log.e(LOG_TAG, "Send file is failed");
}
} catch (XMPPException e) {
Log.e(LOG_TAG, "Unable to send file: "+e.getMessage());
}
}
};
sThread.start();
}
@Override
protected void onActivityResult(int requestCode, int resultcode, Intent intent) {
super.onActivityResult(requestCode, resultcode, intent);
if (requestCode == REQUEST_CODE_FOR_GALLERY) {
if (intent != null) {
Cursor cursor = getContentResolver().query(intent.getData(), null, null, null, null);
cursor.moveToFirst();
int idx = cursor.getColumnIndex(ImageColumns.DATA);
fileSrc = cursor.getString(idx);
File file = new File(fileSrc);
if ( file.exists() ) {
sendFile(file);
} else {
Toast.makeText(context, "Image was not found, please try again.", Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(context, "Cancelled", Toast.LENGTH_SHORT).show();
}
} else if (requestCode == REQUEST_CODE_FOR_FILEMANAGER) {
if ( resultcode == RESULT_OK ) {
if( intent.hasExtra(FilePickerActivity.EXTRA_FILE_PATH) ) {
File file = new File(intent.getStringExtra(FilePickerActivity.EXTRA_FILE_PATH));
// Set the file path text view
if ( file.exists() && isAllowedFileExtension(file) ) {
sendFile(file);
} else {
Toast.makeText(context, "This file is not allowed, please choose another file.", Toast.LENGTH_LONG).show();
}
}
} else {
Toast.makeText(context, "Cancelled", Toast.LENGTH_SHORT).show();
}
}
}
public boolean isAllowedFileExtension(File file) {
boolean result = false;
String filename = file.getName();
int length = filename.length();
int correctPosition = 0;
String ext = "";
for ( int i = length-1; i > 0; i-- ) {
if ( filename.charAt(i) == '.' ) {
correctPosition = i;
break;
}
}
if ( correctPosition == 0 ) {
Toast.makeText(context, "This file is invalid, please choose another file.", Toast.LENGTH_LONG).show();
} else {
for ( int i = correctPosition+1; i < length; i++ ) {
ext += filename.charAt(i);
}
if ( ext.trim().length() == 0 ) {
Toast.makeText(context, "This file is invalid, please choose another file.", Toast.LENGTH_LONG).show();
} else {
boolean isAllowedExtension = false;
String[] allowedExtension = new String[] { "png", "jpg", "gif", "tif", "bmp", "doc", "docx", "ppt", "pptx", "xls", "xlsx", "pdf", "zip", "rar" };
for ( int i = 0; i < allowedExtension.length; i++ ) {
if ( ext.equalsIgnoreCase(allowedExtension[i]) ) {
isAllowedExtension = true;
}
}
if ( isAllowedExtension ) {
result = true;
}
}
}
return result;
}
public boolean isImageFile(File file) {
boolean result = false;
String filename = file.getName();
int length = filename.length();
int correctPosition = 0;
String ext = "";
for ( int i = length-1; i > 0; i-- ) {
if ( filename.charAt(i) == '.' ) {
correctPosition = i;
break;
}
}
if ( correctPosition == 0 ) {
Toast.makeText(context, "This file is invalid, please choose another file.", Toast.LENGTH_LONG).show();
} else {
for ( int i = correctPosition+1; i < length; i++ ) {
ext += filename.charAt(i);
}
if ( ext.trim().length() == 0 ) {
Toast.makeText(context, "This file is invalid, please choose another file.", Toast.LENGTH_LONG).show();
} else {
boolean isAllowedExtension = false;
String[] allowedExtension = new String[] { "png", "jpg", "gif", "tif", "bmp" };
for ( int i = 0; i < allowedExtension.length; i++ ) {
if ( ext.equalsIgnoreCase(allowedExtension[i]) ) {
isAllowedExtension = true;
}
}
if ( isAllowedExtension ) {
result = true;
}
}
}
return result;
}
公共类聊天活动扩展活动{
专用静态最终整型请求\u库代码\u=1;
文件管理器的私有静态最终整数请求\u代码\u=2;
私有静态字符串LOG_TAG=“-Chat Activity-”;
私人语境;
私有列表视图chatListView;
专用按钮附件按钮;
私人按钮发送按钮;
私人编辑文本聊天信息编辑文本;
私人ArrayList聊天记录;
专用聊天适配器;
私有字符串fJID,fNickName;
私有字符串mJID,mNickName;
私有字节[]fAvatarByte,mAvatarByte;
私有位图fAvatarBitmap,mAvatarBitmap;
专用XMPPConnection XMPPConnection;
私有文件传输管理器接收文件管理器;
私有文件传输管理器sendFileManager;
私有文件传输侦听器;
私有文件外部存储目录;
私有字符串文件;
二等兵山德勒,兰德勒;
私有线程sThread;
私有文件;
专用线路布局布局接收文件;
专用线路布局布局SendInfFile;
私人ProgressBar rProgressBar;
私人ProgressBar sProgressBar;
私人聊天经理聊天经理;
私人聊天;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.layout\u chat);
//上下文
上下文=这个;
//视图匹配
chatListView=(ListView)findViewById(R.id.chat\u message\u ListView);
AttachmentButton=(按钮)findViewById(R.id.chat\u AttachmentButton);
sendButton=(按钮)findViewById(R.id.chat\u send\u按钮);
chatMessageEditText=(EditText)findViewById(R.id.chat\u message\u edit\u text);
layoutReceivingFile=(LinearLayout)findViewById(R.id.chat\u file\u transfer\u receive\u布局);
layoutSendinfFile=(LinearLayout)findViewById(R.id.chat\u file\u transfer\u send\u布局);
rProgressBar=(ProgressBar)findViewById(R.id.chat\u receive\u file\u progress\u bar);
sProgressBar=(ProgressBar)findViewById(R.id.chat\u send\u file\u ProgressBar);
//附件按钮的事件
AttachmentButton.setOnClickListener(新的OnClickListener(){
公共void onClick(视图){
AlertDialog.Builder=新建AlertDialog.Builder(上下文);
builder.setTitle(“文件附件”);
setMessage(“选择您的文件类型”);
setNegativeButton(“Picture”,新的DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
意向照片采集器内容=新意向(意向.行动\u采集器);
photopickerinent.setType(“image/*”);
startActivityForResult(照片采集器内容、画廊申请代码);
}
});
setPositiveButton(“文件”,新的DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
意向意向=新意向(ChatActivity.this、FilePickerActivity.class);
ArrayList extensions=新的ArrayList();
扩展。添加(“.png”);
增补(“.jpg”);
添加(“.gif”);
扩展。添加(“.tif”);
添加(“.bmp”);
扩展。添加(“.doc”);
扩展。添加(“.docx”);
扩展。添加(“.ppt”);
扩展。添加(“.pptx”);
扩展。添加(“.xls”);
扩展。添加(“.xlsx”);
增补(“.pdf”);
扩展。添加(“.zip”);
增加(“rar”);
intent.putExtra(FilePickerActivity.EXTRA\u接受的文件扩展名、扩展名);
startActivityForResult(文件管理器的意图、请求代码);
}
});
builder.setCancelable(true);
AlertDialog AlertDialog=builder.create();
alertDialog.show();
}
});
//发送消息按钮的事件
setOnClickListener(新的OnClickListener(){
公共void onClick(视图){
String message=chatMessageEditText.getText().toString();
if(message.trim().length()==0){
Toast.makeText(上下文,“请填写一些文本”,Toast.LENGTH_SHORT.show();
}否则{
试一试{
发送消息(message);
chatMessageEditText.setText(空);
Log.d(Log_标签,“尝试发送消息1”);
Toast.makeText(上下文,“尝试发送”+message.toString(),Toast.LENGTH_LONG.show();
ChatEntry ChatEntry=新建ChatEntry();
chatEntry.setAttachedFile(false);
chatEntry.setFilePath(null);
chatEntry.setSenderJID(mJID);
chatEntry.setReceiverJID(fJID);
chatEntry.setSenderAvatarBitmap(mAvatarBitmap);
setWhen(System.currentTimeMillis());
setMessage(message);
Log.d(Log_标签,“尝试发送消息2”);
添加(chatEntry);
setData(chatEntries);
notifyDataSetChanged();
chatListView.setSelection(chatEntries.size()-1);
L