您的当前位置:首页正文

android即时通信系统源代码

来源:九壹网


/*文件:Principal.java

描述:项目IMA的。主类,为学科发展 工作从天主教大学毕业米纳斯吉拉斯 Pocos德卡尔达斯 - 爵 开发者:

温贝托Cerqueira Gobatto

帕德里弗朗西斯克莱特斯考克斯,665 CEP证书:37701-355

市/州:德卡尔达斯Pocos - 爵 国家:巴西

日期:2009年12月

邮寄地址:humberto.gobatto@gmail.com*/

package br.android.ima;

import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar;

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

import org.jivesoftware.smack.filter.MessageTypeFilter; import org.jivesoftware.smack.filter.PacketFilter; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Packet; import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smack.util.StringUtils; import android.app.Activity;

import android.app.NotificationManager; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.util.Log;

import android.view.MenuItem; import android.view.View;

import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; import android.widget.Spinner; import android.widget.Toast;

import br.android.ima.dialog.SettingsDialog;

import br.android.ima.notificacao.ServicoNotificaChat; public class Principal extends Activity {

/** Called when the activity is first created. */

private ArrayList messages = new ArrayList(); private Handler mHandler = new Handler(); private SettingsDialog xmppConecta; private EditText editDestino = null; private String txtEmail = null;

private EditText editMens = null; private ListView listChat;

public static XMPPConnection connection; public static final int CONECTAR = 0; public static final int CONTATOS = 1; public static final int SAIR = 2; public int FINISH = 0; public static int PAUSA = 0; private String stxtStatus = null; private String[] mStatus = new String[] { \"Online\\"Ocupado\\"Ausente\\"Ausente Estendido\ private String txtStatus = null; private String apelido = null; public final static Intent itNotifica = new Intent(\"NOTIFICA\"); public SimpleDateFormat fhora = new SimpleDateFormat(\"H:mm\"); @Override protected void onActivityResult(int codigo, int resultado, Intent it) { super.onActivityResult(codigo, resultado, it); if (codigo == 1) { if(it == null){ Toast.makeText(this, \"Nenhum contato Toast.LENGTH_SHORT).show(); editDestino.setText(null); txtEmail = null; return; } else { Bundle params = it.getExtras(); apelido = params.getString(\"apelido\"); txtEmail = params.getString(\"email\"); editDestino.setText(txtEmail); } } } private void setListAdapter() { ArrayAdapter adapter = new ArrayAdapter(this, R.layout.multi_line_list_item, messages); listChat.setAdapter(adapter); } @Override

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

editDestino = (EditText) this.findViewById(R.id.destino); editMens = (EditText) this.findViewById(R.id.Mensagem); listChat = (ListView) this.findViewById(R.id.listMessages); // 提请XMPP的窗口配置

xmppConecta = new SettingsDialog(this); //Botes

Button send = (Button) this.findViewById(R.id.btnEnviar);

Button limpar = (Button) this.findViewById(R.id.btnLimpar); // Aes aos botes

limpar.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { txtEmail = \"\";

selecionado\

editDestino.setText(\"\");

editMens.setText(\"huyuan\"); editMens.clearFocus(); messages.clear(); setListAdapter();

} });

send.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { String to = txtEmail;

String text = editMens.getText().toString(); text = text.trim();

if (editDestino.getText().toString().length() > 0){ txtEmail = editDestino.getText().toString(); }

if (txtEmail == null | editDestino.getText().toString() == null){ Toast.makeText(Principal.this, \"选择联系人菜单->联系!\ } else if(text != \"\" | text.length() > 0){ Message msg = new Message(to, Message.Type.chat); msg.setBody(text); connection.sendPacket(msg); Long ms = Calendar.getInstance().getTimeInMillis(); String hora = String.valueOf(fhora.format(ms)); messages.add(0,hora + \" - para: \"+apelido+\" - eu: \\n\"+text); setListAdapter(); }

editMens.setText(null); } }); }

public void setConnection(final XMPPConnection connecta) { Button send = (Button) this.findViewById(R.id.btnEnviar); Spinner comboStatus = (Spinner) findViewById(R.id.comboStatus); final ImageView imgStatus = (ImageView) this.findViewById(R.id.seuStatus); //TextView txtStatus = (TextView) this.findViewById(R.id.labelStatus); send.setEnabled(true); comboStatus.setClickable(true); //当你点击微调 comboStatus.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View v, int posicao, long id) { ConnectionConfiguration connConfig = null; if (connection != null) {connection.disconnect();} //Toast.makeText(Principal.this, \": \"+SettingsDialog.host, Toast.LENGTH_LONG).show(); if (SettingsDialog.service != \"\") { // 创建有关的XMPP服

connConfig = new ConnectionConfiguration(SettingsDialog.host,

SettingsDialog.port, SettingsDialog.service); } else { // 没有建立相关的XMPP服务器 connConfig =new ConnectionConfiguration(SettingsDialog.host, SettingsDialog.port); } XMPPConnection connection = new XMPPConnection(connConfig); //editDestino.setText(connection.getServiceName());

try { if (connection.isConnected() == false) {connection.connect(); } } catch (XMPPException ex) { Log.e(\"IMA\连接]无法连接到 \" + connection.getHost()); //Log.e(\"IMA\ Toast.makeText(Principal.this, \"失败的连接: \"+SettingsDialog.host, Toast.LENGTH_LONG).show(); //setConnection(null);} try { if (connection.isConnected()) { connection.login(SettingsDialog.username, SettingsDialog.password); Presence presence = new Presence(Presence.Type.available); if (posicao == 0){ presence.setMode(Presence.Mode.available); txtStatus = \"Online\"; imgStatus.setImageResource(R.drawable.online); } else if (posicao == 1){ presence.setMode(Presence.Mode.dnd); txtStatus = \"Ocupado\"; imgStatus.setImageResource(R.drawable.ocupado); } else if (posicao == 3){ presence.setMode(Presence.Mode.xa); txtStatus = \"Ausente Estendido\"; imgStatus.setImageResource(R.drawable.ausente); } else if (posicao == 2){ presence.setMode(Presence.Mode.away); txtStatus = \"Ausente\"; imgStatus.setImageResource(R.drawable.ausente); } setarStatus(txtStatus); presence.setStatus(SettingsDialog.mpessoal); connection.sendPacket(presence); setConnection(connection); } } catch (XMPPException ex) { Log.e(\"IMA\设定对话]无法登录为 \" + SettingsDialog.username); Log.e(\"IMA\ // connection = null; // setConnection(null); //dismiss(); Toast.makeText(Principal.this, \"失败的连接: \"+SettingsDialog.host, Toast.LENGTH_LONG).show(); } } public void onNothingSelected(AdapterView parent) { } }); connection = connecta; if (connection.isConnected() | connection.isAuthenticated()) { send.setEnabled(true); if (stxtStatus == \"Online\"){ imgStatus.setImageResource(R.drawable.online); comboStatus.setSelection(0); } else if (stxtStatus == \"Ocupado\"){ imgStatus.setImageResource(R.drawable.ocupado); comboStatus.setSelection(1);

} else if (stxtStatus == \"Ausente\"){ imgStatus.setImageResource(R.drawable.ausente); comboStatus.setSelection(2); } else { comboStatus.setSelection(3); } //txtStatus.setText(stxtStatus); // 添加包来获得传入的消息监听器

PacketFilter filter = new MessageTypeFilter(Message.Type.chat); connection.addPacketListener(new PacketListener() { public void processPacket(Packet packet) { Message message = (Message) packet; if (message.getBody() != null) {

String fromName = StringUtils.parseBareAddress(message.getFrom()); String nickname = null;

int end = fromName.lastIndexOf(\"@\");

if (end != -1){nickname = fromName.substring(0,end);} String chat = message.getBody();

Long ms = Calendar.getInstance().getTimeInMillis(); String hora = String.valueOf(fhora.format(ms)); messages.add(0,hora+\" - \"+nickname+\" diz: \\n\"+chat); mHandler.post(new Runnable() { public void run() { setListAdapter(); } }); } } }, filter); } else { connection.disconnect(); connection = null; } }

/* protected void onStart() { super.onStart(); Log.i(\"-------\ Log.e(\"onStart\输入 } */ protected void onRestart() { super.onRestart(); Log.i(\"-------\---------------------------------------\"); Log.e(\"onRestart\\"ENTRADA 重启PAUSA:\"+PAUSA+\" FINISH:\"+FINISH+\" ON:\"+ServicoNotificaChat.on); if (PAUSA == 1) { PAUSA = 0; if (ServicoNotificaChat.on) { //对于服务 stopService(itNotifica);

Log.w(\"onRestart\�O\");

} else Log.w(\"onRestart\�O PAREI SERVI�O\"); } Log.e(\"onRestart\\"SAIDA PAUSA:\"+PAUSA+\" ON:\"+ServicoNotificaChat.on); }

FINISH:\"+FINISH+\"

/* protected void onResume() { super.onResume(); Log.i(\"-------\ Log.e(\"onResume\ } */ protected void onPause() { super.onPause(); Log.i(\"-------\ Log.e(\"onPause\\"ENTRADA PAUSA:\"+PAUSA+\" FINISH:\"+FINISH+\" ON:\"+ServicoNotificaChat.on); PAUSA = 1; if (FINISH == 0 && connection != null && ServicoNotificaChat.on == false) { Log.w(\"onPause\ PAUSA = 1; startService(itNotifica); } else { PAUSA = 0; } Log.e(\"onPause\\"SAIDA 即时通信暂停PAUSA:\"+PAUSA+\" FINISH:\"+FINISH+\" ON:\"+ServicoNotificaChat.on); } /* protected void onStop() { super.onStop(); Log.i(\"-------\ Log.e(\"onStop\ } */ protected void onDestroy() { super.onDestroy(); Log.i(\"-------\ Log.e(\"onDestroy\\"ENTRADA即时通信退出 PAUSA:\"+PAUSA+\" FINISH:\"+FINISH+\" ON:\"+ServicoNotificaChat.on); PAUSA = 0; FINISH = 0; if (connection != null) { if (ServicoNotificaChat.on == true){ //对于服务 stopService(itNotifica); ServicoNotificaChat.on = false; Log.w(\"onDestroy\停止服务\"); } else Log.w(\"onDestroy\停止服务\"); // 取消通知 NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // 要取消您需要使用相同的ID是用于创建 nm.cancel(R.string.app_name); connection.disconnect(); connection = null; } Log.e(\"onDestroy\\"SAIDA PAUSA:\"+PAUSA+\" FINISH:\"+FINISH+\"

ON:\"+ServicoNotificaChat.on); //打破输出 } @Override public boolean onCreateOptionsMenu(android.view.Menu menu) { super.onCreateOptionsMenu(menu); //菜单中添加了三个OPES menu.add(0, CONECTAR, 0, \"连接\") //连接 .setIcon(R.drawable.conectar); menu.add(0, CONTATOS, 0, \"联系人\")//联系人 .setIcon(R.drawable.contatos); menu.add(0, SAIR, 0, \"退出\")//退出 .setIcon(R.drawable.fechar);//关闭 return true; } @Override //行动的菜单按钮 public boolean onMenuItemSelected(int featureId, MenuItem item) { switch (item.getItemId()) { case CONTATOS: if (connection != null) { Intent it = new Intent(\"ABRIR\"); it.addCategory(\"CONTATOS\"); startActivityForResult(it,1); return true; } else { Toast.makeText(Principal.this, \"连接,然后再打开你的联系人!\Toast.LENGTH_SHORT).show(); return false; } case CONECTAR: if (item.getTitle() != \"更改帐户\" & connection != null) { item.setTitle(\"更改帐户\"); } Spinner comboStatus = (Spinner) findViewById(R.id.comboStatus); ArrayAdapter adaptadorServico = new ArrayAdapter(this,android.R.layout.simple_spinner_item,mStatus);

adaptadorServico.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); comboStatus.setAdapter(adaptadorServico); setListAdapter(); mHandler.post(new Runnable() { public void run() { xmppConecta.show(); } }); return true; case SAIR: FINISH = 1; if (connection == null) { finish();

} else { connection.disconnect(); finish(); } } return false; } public void setarStatus(String txt) { stxtStatus = txt; } }

/* 文件:Contatos.java

package br.android.ima.contatos;

import java.util.List;

import android.content.Context; import android.view.LayoutInflater; import android.view.View;

import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import br.android.ima.R;

public class Contatos extends BaseAdapter { private Context context; private List lista;//列表国家 public Contatos(Context context, List lista) { this.context = context; this.lista = lista;} public int getCount() { return lista.size(); } public Object getItem(int position) { return lista.get(position);} public long getItemId(int position) { return position;} public View getView(int posicao, View convertView, ViewGroup parent) { //位置po~~ //检索标题现状 Estado status = lista.get(posicao); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = inflater.inflate(R.layout.status_row, null); // 更新了的文本的昵称和电子邮件的值 TextView textApelido = (TextView) v.findViewById(R.id.apelido);//昵称 TextView textEmail = (TextView) v.findViewById(R.id.email); textApelido.setText(status.apelido); textEmail.setText(status.email); // 更新图像到图像的状态 // 该图像由资源在@绘制 ImageView img = (ImageView) v.findViewById(R.id.img); img.setImageResource(status.getImagem()); return v; } }

/*文件:Contatos.java

package br.android.ima.contatos;

import java.util.ArrayList; import java.util.Collection;

import org.jivesoftware.smack.PacketListener; import org.jivesoftware.smack.Roster;

import org.jivesoftware.smack.RosterEntry; import org.jivesoftware.smack.RosterListener; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.packet.Packet; import org.jivesoftware.smack.packet.Presence; import br.android.ima.Principal;//顶部 import br.android.ima.R;

import android.app.AlertDialog; import android.app.ListActivity;

import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.util.Log;

import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View;

import android.view.ContextMenu.ContextMenuInfo; import android.widget.EditText; import android.widget.ListView; import android.widget.Toast;

import android.widget.AdapterView.AdapterContextMenuInfo;

public class ContatosActivity extends ListActivity implements RosterListener, PacketListener, Runnable { private ArrayList list = new ArrayList(); private String nick = null;//缺口 private Estado contato = null;//联系 private Roster roster = Principal.connection.getRoster();//列表 private Handler handler; private boolean on; public static final int RENOMEAR = 0;//重命名 public static final int BLOQUEAR = 1;//BLOQUEAR @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); registerForContextMenu(getListView()); setTitle(roster.getEntryCount()+\" 连接\"); handler = new Handler(); handler.post(this); processa(); } @Override protected void onStart() { super.onStart(); on = true;

Log.i(\"CONTATOS\连接onStart()\"); } public void run() { if (on) { processa(); handler.postDelayed(this, 20000); Log.e(\"联系我们\运行\");//联系我们运行 } else { Log.i(\"联系我们\处理程序的顺序\"); } } @Override protected void onDestroy() { super.onDestroy(); // 处理完消息 Log.i(\"联系我们\ on = false; //对于服务 stopService(Principal.itNotifica); } private void processa() { list.clear(); try {

// Sleep for a second

try { Thread.sleep(1000); } catch (InterruptedException e) { Log.e(\"SLEEP\\"processa错误: \"+ e); }

Collection entries = roster.getEntries(); for (RosterEntry entry : entries) {

Presence presence = roster.getPresence(entry.getUser()); processPacket(presence, entry.getName()); } } catch (Exception e) { Log.e(\"CONEXAO\无连接: \"+ e);//无连接 } } public void processPacket(Packet packet, String apelido) { String email = \"\"; Presence presence = (Presence)packet;

Presence.Type presenceType = presence.getType(); Presence.Mode modo = presence.getMode(); String from = packet.getFrom().toString(); int end = from.lastIndexOf(\"/\"); if (end != -1){ email = from.substring(0,end); } else { email = from; }

end = from.lastIndexOf(\"@\"); if (end != -1){ String nome = from.substring(0,end); if (apelido == null) apelido = nome; }

if(presenceType == Presence.Type.available){

if (modo == Presence.Mode.available) { list.add(0,new Estado(email, apelido, Estado.S_ON)); } else if (modo == Presence.Mode.away) { list.add(0,new Estado(email, apelido, Estado.S_AWAY)); } else if (modo == Presence.Mode.chat) { list.add(0,new Estado(email, apelido, Estado.S_ON)); } else if (modo == Presence.Mode.dnd) { list.add(0,new Estado(email, apelido, Estado.S_BUSY)); } else if (modo == Presence.Mode.xa) { list.add(0,new Estado(email, apelido, Estado.S_AWAY)); } else { list.add(0,new Estado(email, apelido, Estado.S_ON)); } }

if(presenceType == Presence.Type.unavailable) { list.add(new Estado(email, apelido, Estado.S_OFF)); } //列表适配器定制每个微笑线

setListAdapter(new Contatos(ContatosActivity.this, list)); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); //获取微笑Posio Estado estado = (Estado) this.getListAdapter().getItem(position);//国家 //显示一个警告 Toast.makeText(this, \"您选择的联系方式: \" + estado.apelido, Toast.LENGTH_LONG).show(); //创建一个bundle返回名称... Bundle params = new Bundle();

params.putString(\"email\ params.putString(\"apelido\ Intent itRetorno = new Intent(); itRetorno.putExtras(params); setResult(RESULT_OK, itRetorno); //活动结束此返回结果 finish(); } @Override public void entriesAdded(Collection arg0) { } @Override public void entriesDeleted(Collection arg0) { } @Override public void entriesUpdated(Collection arg0) { } @Override public void presenceChanged(Presence arg0) {

} @Override public void processPacket(Packet arg0) { } @Override public boolean onContextItemSelected(MenuItem item) { switch(item.getItemId()) { case RENOMEAR: AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); contato = (Estado) this.getListAdapter().getItem(info.position);//联系 // 这个例子说明如何添加一个自定义布局,以一警告对话框 LayoutInflater factory = LayoutInflater.from(this);

final View textEntryView = factory.inflate(R.layout.setar_nome, null);

AlertDialog.Builder alerta = new AlertDialog.Builder(ContatosActivity.this); //alerta.setIcon(R.drawable.icone);

alerta.setTitle(\"更改昵称: \"+contato.apelido); alerta.setView(textEntryView);

alerta.setIcon(R.drawable.rename); // 实现的方法来选择的变化 alerta.setPositiveButton(\"更改删除\new DialogInterface.OnClickListener() {//更改删除 public void onClick(DialogInterface dialog, int whichButton) { EditText editNovoNome = (EditText) textEntryView.findViewById(R.id.editNovoNome); if (editNovoNome.getText().toString().trim() != \"\" ) nick = editNovoNome.getText().toString(); else nick = null; try{ XMPPConnection connection = Principal.connection; Roster roster = connection.getRoster(); roster.getEntry(contato.email).setName(nick); Toast.makeText(ContatosActivity.this, \"联系人姓名:\" + contato.email +\" 更改为: \"+nick, Toast.LENGTH_LONG).show(); processa(); setListAdapter(new Contatos(ContatosActivity.this, list)); } catch (Exception e) { Log.e(\"CONEXAO\无连接 \"+ e); Principal.connection = null; } } }); // 方法运行,如果你选择取消 alerta.setNegativeButton(\"Cancelar\ public void onClick(DialogInterface dialog, int whichButton) { Toast.makeText(ContatosActivity.this, \"联系人姓名: \" + contato.email +\" 没有变化!\ processa(); dialog.dismiss(); } }); // 显示警报确认 alerta.show(); return true;

//case BLOQUEAR: // return true; } return super.onContextItemSelected(item); } public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); menu.add(0, RENOMEAR, 0, \"黑名单\"); // menu.add(0, BLOQUEAR, 0, \"Bloquear Contato\");//封锁联络人 } }

/* Arquivo: EscolherContatosActivity.java//存档

package br.android.ima.contatos; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.Toast;

public class EscolherContatoActivity extends Activity { private static final int BUSCA_CONTATO = 1;//联系搜索 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent it = new Intent(this, ContatosActivity.class); // 发送消息 在“意图”调用到系统操作 startActivityForResult(it,BUSCA_CONTATO); } @Override protected void onActivityResult(int codigo, int resultado, Intent it) { super.onActivityResult(codigo, resultado, it); if (codigo == BUSCA_CONTATO) { if(it == null){ Toast.makeText(this, \"没有联系人\没有联系人 return; } Bundle params = it.getExtras(); String nome = params.getString(\"nome\"); //Log.i(\"CONTATOS\ Intent itRetorno = new Intent();//返回 itRetorno.putExtras(params); setResult(RESULT_OK, itRetorno); //显示一个警告与选定的联系 Toast.makeText(this, \"您选择: \" + nome,Toast.LENGTH_SHORT).show();//您选择 } }}

/* Arquivo: Estado.java

package br.android.ima.contatos;

import br.android.ima.R; public class Estado { public static final int S_AWAY = 0;

public static final int S_BUSY = 1; public static final int S_ON = 2; public static final int S_OFF = 3; public static final int S_INV = 4; public String apelido; public String email; private final int tipo; public Estado(String email, String apelido,int tipo) { this.apelido = apelido; this.email = email; this.tipo = tipo; } /** *返回图像的状态 * /res/drawable 这些照片被插入 * @return */ public int getImagem() { switch (tipo) { case S_AWAY: return R.drawable.ausente; case S_BUSY: return R.drawable.ocupado; case S_INV: return R.drawable.invisivel; case S_OFF: return R.drawable.offline; case S_ON: return R.drawable.online; } return R.drawable.offline; } }

/* Arquivo: PersonalizaDialog.java

package br.android.ima.dialog;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import br.android.ima.Principal; import br.android.ima.R; import android.app.Dialog;

import android.content.Context; /*import android.os.Bundle; import android.util.Log; import android.view.View;

import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner;

import android.widget.Toast;

import br.android.ima.dialog.SettingsDialog;*/ import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; //import android.widget.Toast; import android.widget.EditText;

public class PersonalizaDialog extends Dialog { private Principal telaCliente; private static final String ARQUIVO = \"servidor.bin\";//档案文件 public PersonalizaDialog(Principal telaCliente) { super(telaCliente);//顾客屏幕 this.telaCliente = telaCliente; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.persona); Log.i(\"试验\定制\");//定制

Button ok = (Button) findViewById(R.id.ok);

//Toast.makeText(telaCliente, \"Show\ ok.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { gravarArquivo(); dismiss(); } }); }

protected void onStart() { super.onStart();

getWindow().setFlags(4, 4);

setTitle(\"自定义XMPP服务器\");

File f = telaCliente.getFileStreamPath(ARQUIVO); if(f.exists()){ visualizarArquivo(); } }

private String getText(int id) {

EditText widget = (EditText) this.findViewById(id); return widget.getText().toString(); } private void gravarArquivo() { SettingsDialog.Phost = getText(R.id.host); SettingsDialog.Pport = getText(R.id.port);

SettingsDialog.Pservice = getText(R.id.service);

File f = telaCliente.getFileStreamPath(ARQUIVO); if(f.exists()){ telaCliente.deleteFile(ARQUIVO); } try { FileOutputStream out = telaCliente.openFileOutput(ARQUIVO, Context.MODE_APPEND);

if (SettingsDialog.Phost.getBytes().length > 0){ out.write(SettingsDialog.Phost.getBytes()); } else out.write(\"输入网址\".getBytes()); out.write(\"#\".getBytes()); if (SettingsDialog.Pport.getBytes().length > 0){ out.write(SettingsDialog.Pport.getBytes()); } else out.write(\"5222\".getBytes()); out.write(\"#\".getBytes()); if (SettingsDialog.Pservice.getBytes().length > 0){ out.write(SettingsDialog.Pservice.getBytes()); } else out.write(\"输入网址\".getBytes()); out.close(); Log.i(\"IMA\写入成功\"); } catch (FileNotFoundException e) { Log.e(\"IMA\ } catch (IOException e) { Log.e(\"IMA\ } }

public void visualizarArquivo() { try { File f = telaCliente.getFileStreamPath(ARQUIVO); Log.i(\"IMA\打开文件: \" + f.getAbsolutePath()); if(f.exists()){ FileInputStream in = telaCliente.openFileInput(ARQUIVO); int tamanho = in.available(); byte bytes[] = new byte[tamanho]; in.read(bytes); String s = new String(bytes); Log.e(\"IMA\ String[] VET = s.split(\"#\"); Log.e(\"IMA\ if (VET[0].length() > 0){ EditText host = (EditText) this.findViewById(R.id.host); host.setText(VET[0]); } if (VET[1].length() > 0){ EditText porta = (EditText) this.findViewById(R.id.port); porta.setText(VET[1]); } if (VET[2].length() > 0){ EditText servico = (EditText) this.findViewById(R.id.service); servico.setText(VET[2]); } }else{ Log.i(\"IMA\没有文件被删除或不存在\");//没有文件被删除或不存在 //text.setText(\"\"); } } catch (FileNotFoundException e) { Log.e(\"IMA\文件未找到: \" + e.getMessage(), e);//文件未找到 } catch (IOException e) { Log.e(\"IMA\ } } }

/* Arquivo: SettingsDialog.java

package br.android.ima.dialog;

import android.app.Dialog; import android.os.Bundle; import android.util.Log; import android.view.View;

import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import android.widget.Toast; import br.android.ima.Principal; import br.android.ima.R;

import org.jivesoftware.smack.ConnectionConfiguration; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.packet.Presence; public class SettingsDialog extends Dialog { private Principal telaCliente; private String[] mStatus = new String[] { \"Online\\"Ocupado\\"Ausente\\"Ausente Estendido\“在线”,“忙碌”,“离开”,“扩展离开” private String[] servicos = new String[] { \"Google Talk\ public static final int S_ON = 0; public static final int S_BUSY = 1; public static final int S_AWAY = 2; public static final int S_XA = 3; public static final int GTALK = 0; public static final int JABBER = 1; public static final int PERSONAL = 2; public static int servico = 0; public static String host = null; public static Integer port = null; public static String service = null; public static String Phost = null; public static String Pport = null; public static String Pservice = null; public static String username = null; public static String password = null; private PersonalizaDialog xmppPersona; public static int status = 0;

public static String mpessoal = null;

public SettingsDialog(Principal telaCliente) { super(telaCliente);

this.telaCliente = telaCliente; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.settings);

final Spinner comboStatus = (Spinner) findViewById(R.id.comboStatus);

final Spinner comboServico = (Spinner) findViewById(R.id.comboServico);

ArrayAdapter adaptadorStatus = new ArrayAdapter(telaCliente,android.R.layout.simple_spinner_item,mStatus); ArrayAdapter adaptadorServico = new ArrayAdapter(telaCliente,android.R.layout.simple_spinner_item,servicos); //一般的列表 //adaptadorStatus.setDropDownViewResource(android.R.layout.simple_spinner_item); //adaptadorServico.setDropDownViewResource(android.R.layout.simple_spinner_item); //单选框列表 adaptadorStatus.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); adaptadorServico.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); comboServico.setAdapter(adaptadorServico); comboStatus.setAdapter(adaptadorStatus); }

protected void onStart() { super.onStart();

getWindow().setFlags(4, 4); setTitle(\"XMPP的帐户配置\");

Button conectar = (Button) findViewById(R.id.conectar); Button cancelar = (Button) findViewById(R.id.cancelar);

Spinner Seleciona = (Spinner) findViewById(R.id.comboServico); final Button personalizar = (Button) findViewById(R.id.personalizar); personalizar.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { //Log.i(\"TESTE\ Toast.makeText(telaCliente, \"失败的连接: \"+host, Toast.LENGTH_LONG).show(); xmppPersona = new PersonalizaDialog(telaCliente); xmppPersona.show(); } });

//当你点击微调

Seleciona.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View v, int posicao, long id) { if (posicao == PERSONAL) { personalizar.setEnabled(true); } else personalizar.setEnabled(false); servico = posicao; } public void onNothingSelected(AdapterView parent) { } });

conectar.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { ConnectionConfiguration connConfig = null; if (Principal.connection != null) { Principal.connection.disconnect(); } if (servico == GTALK) { host = \"talk.google.com\"; port = 5222; service = \"gmail.com\";

// 建立与服务有关的XMPP服务器 connConfig = new ConnectionConfiguration(host, port, service); } if (servico == JABBER) { host = \"jabber.org\"; port = 5222; service = \"\"; // 创建一个具有无服务连接XMPP服务器 connConfig = new ConnectionConfiguration(host, port); } if (servico == PERSONAL) { host = Phost; port = Integer.parseInt(Pport); service = Pservice; if (service == \"输入网址\") { service = \"\";

// 创建XMPP服务器没有相关的服务 connConfig = new ConnectionConfiguration(host, port); } else { // XMPP服务器创建与关联 connConfig = new ConnectionConfiguration(host, port, service); } }

username = getText(R.id.editUsuario);

password = getText(R.id.editSenha); status = getCombo(R.id.comboStatus);//组合状态 mpessoal = getText(R.id.editMens); String txtStatus = null; XMPPConnection connection = new XMPPConnection(connConfig); try { if (connection.isConnected() == false) { connection.connect(); } } catch (XMPPException ex) { Log.e(\"IMA\连接]无法连接到\" + connection.getHost());//未按照有关 Toast.makeText(telaCliente, \"连接失败: \"+SettingsDialog.host, Toast.LENGTH_LONG).show();//有关故障 //Log.e(\"IMA\ //connection = null; //telaCliente.setConnection(null); } try { if (connection.isConnected()) { connection.login(username, password); Presence presence = new Presence(Presence.Type.available); if (status == S_ON){ presence.setMode(Presence.Mode.available); txtStatus = \"Online\"; } else if (status == S_BUSY){ presence.setMode(Presence.Mode.dnd); txtStatus = \"Ocupado\"; } else if (status == S_XA){ presence.setMode(Presence.Mode.xa); txtStatus = \"Ausente Estendido\";

} else if (status == S_AWAY){ presence.setMode(Presence.Mode.away); txtStatus = \"Ausente\"; } telaCliente.setarStatus(txtStatus); presence.setStatus(mpessoal); connection.sendPacket(presence); telaCliente.setConnection(connection); dismiss(); } } catch (XMPPException ex) { Log.e(\"IMA\设定对话]无法登录为: \" + username); Log.e(\"IMA\ //connection = null; //telaCliente.setConnection(null); dismiss(); Toast.makeText(telaCliente, \"连接失败:Toast.LENGTH_LONG).show(); } } });

cancelar.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { dismiss(); } }); }

private String getText(int id) {

EditText widget = (EditText) this.findViewById(id); return widget.getText().toString(); }

private int getCombo(int id) {

Spinner widget = (Spinner) this.findViewById(id); return widget.getSelectedItemPosition(); } }

/* Arquivo: ExecutaNotificacao.java package br.android.ima.notificacao;

import android.app.Activity;

import android.app.NotificationManager; import android.content.Context; import android.content.Intent; import android.os.Bundle;

import br.android.ima.Principal; import br.android.ima.R; /**

*活动时运行的用户选择在状态栏通知

*在这里,作出了取消的通知,关闭后用户同样打开 */

public class ExecutaNotificacao extends Activity { @Override

\"+host,

protected void onCreate(Bundle icicle) { super.onCreate(icicle); // 取消通知 NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // 要取消您需要使用相同的ID是用于创建 nm.cancel(R.string.app_name); Intent itNotifica = new Intent(\"NOTIFICA\"); Intent intent = new Intent(\"MAIN\"); setIntent(intent); if (!ServicoNotificaChat.on) { Principal.PAUSA = 0; stopService(itNotifica); } finish(); } }

/* Arquivo: ServicoNotificaChat.java

package br.android.ima.notificacao;

import org.jivesoftware.smack.PacketListener; import org.jivesoftware.smack.XMPPConnection;

import org.jivesoftware.smack.filter.MessageTypeFilter; import org.jivesoftware.smack.filter.PacketFilter; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Packet; import org.jivesoftware.smack.util.StringUtils; import br.android.ima.Principal; import br.android.ima.R;

import android.app.Notification;

import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.util.Log;

public class ServicoNotificaChat extends Service implements Runnable { private static final String CATEGORIA = \"TESTE\"; public CharSequence tickerText = \"新的聊天开始\";//新的聊天开始 public CharSequence titulo = \"\"; public CharSequence mensagem = \"\"; public XMPPConnection conectaNotifica = Principal.connection; public PacketListener pacote; public static boolean on; @Override public IBinder onBind(Intent i) { Log.e(CATEGORIA, \"范例Servico.onBind()\"); //类别 //空 在这里不想与服务交互 return null; } @Override public void onCreate() {

Log.e(CATEGORIA, \"范例Servico.onCreate()\"); //一个线程代表 if (Principal.connection != null){ new Thread(this).start(); on = true; } else stopSelf(); } @Override public void onStart(Intent intent,int startId) { Log.e(CATEGORIA, \"范例Servico.onStart()\"); if (Principal.PAUSA == 0){ stopSelf(); } } @Override public void onDestroy() { Log.e(CATEGORIA, \"范例Servico.onDestroy()\"); Log.w(CATEGORIA,\"前: \"+on); if (on){ stopSelf(); on = false; conectaNotifica.removePacketListener(pacote); } Log.w(CATEGORIA,\"接下来: \"+on); } /** * @see java.lang.Runnable#run() */ public void run() { // 添加包来获得传入的消息监听器 PacketFilter filter = new MessageTypeFilter(Message.Type.chat); conectaNotifica.addPacketListener(pacote = new PacketListener() { public void processPacket(Packet packet) { Message message = (Message) packet; if (message.getBody() != null) { String fromName = StringUtils.parseBareAddress(message.getFrom()); //与呼叫文本通知(状态栏) //详细的邮件,发件人和文本 titulo = fromName; mensagem = (message.getBody()); // 通知收到的消息显示,打开活动 criarNotificacao(pacote, tickerText, titulo, mensagem, ExecutaNotificacao.class); } } }, filter); } //显示通知 public void criarNotificacao(PacketListener packetListener, CharSequence mensagemBarraStatus, CharSequence titulo,CharSequence mensagem, Class activity) { // 检索服务通知管理员 NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

Notification n = new Notification(R.drawable.notifica, mensagemBarraStatus, System.currentTimeMillis()); // 待活动意向运行河犹他州立大学的选择 // 通知 PendingIntent p = PendingIntent.getActivity(this, 0, new Intent(this, activity), 0); // 信息 n.setLatestEventInfo(this, titulo, mensagem, p); // 需要权限:<用途,权限 // android:name=\"android.permission.VIBRATE\" /> // 等待100毫秒和250ms的震动,然后等待100毫秒和震动 // 500ms. n.vibrate = new long[] { 100, 250, 100, 500 }; //编号(唯一编号),确定本通知 nm.notify(R.string.app_name, n); } }

因篇幅问题不能全部显示,请点此查看更多更全内容

Top