在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → android 局域网聊天

android 局域网聊天

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:4.10M
  • 下载次数:41
  • 浏览次数:424
  • 发布时间:2016-05-17
  • 实例类别:Android平台开发
  • 发 布 人:lisb08
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 局域网 聊天

实例介绍

【实例简介】

类似QQ聊天软件,局域网收发消息

测试结果:可发送文本消息,发语音消息时 失败

测试环境:android 4.4



【实例截图】


【核心代码】

package com.myandroid.activity;
import java.io.File;
import java.io.IOException;
import java.util.List;

import com.myandroid.message.R;
import com.myandroid.util.Media;
import com.myandroid.util.Msg;
import com.myandroid.util.Tools;
import com.myandroid.util.User;

import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

public class ChatActivity extends Activity implements OnClickListener{
	//参数
	private LinearLayout chartMsgPanel = null;
	private ScrollView chartMsgScroll = null;
	private User person=null;
	private EditText chartMsg = null;
	private Button chartMsgSend = null;
	//private Button chartMsgFile = null;
	//private Button chartTalk=null;
	private Button chartMediaRecord=null;
	public Tools tools=null;
	AlertDialog revTalkDialog=null,callDialog=null;
	MediaDialog mediadialog=null;
	Media media=new Media();
	public String choosePath = null;// 选中的文件
	ProgressDialog proDia = null;
	Double fileSize=0.0;
	// 滚动屏幕
	private final Handler mHandler = new Handler();
    private Runnable scrollRunnable= new Runnable() {
	    @Override
	    public void run() {
            int offset = chartMsgPanel.getMeasuredHeight() - chartMsgScroll.getHeight();//判断高度 
            if (offset > 0) {
	            chartMsgScroll.scrollBy(0, 100);//每次滚100个单位
	        }
	    }
    };
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏
		//初始化
		Tools.State=Tools.CHATACTIVITY;
		Tools.chart=this;
		setContentView(R.layout.activity_chart);
		Intent intent = getIntent();
		person = (User)intent.getExtras().getSerializable("person");
		((TextView)findViewById(R.id.my_nickename)).setText(person.getName());
		//chartTalk=(Button)findViewById(R.id.chart_talk);
		//chartTalk.setOnClickListener(this);
		chartMsg = (EditText)findViewById(R.id.chart_msg);
		chartMsgSend = (Button)findViewById(R.id.chart_msg_send);
		chartMsgSend.setOnClickListener(this);
		//chartMsgFile = (Button)findViewById(R.id.chart_msg_file);
		//chartMsgFile.setOnClickListener(this);
		chartMsgPanel = (LinearLayout)findViewById(R.id.chart_msg_panel);
		chartMsgScroll = (ScrollView)findViewById(R.id.chart_msg_scroll);
		chartMediaRecord=(Button)findViewById(R.id.chart_media_record);
		chartMediaRecord.setOnLongClickListener(new OnLongClickListener() {
			@Override
			public boolean onLongClick(View v) {
				mediadialog = new MediaDialog(ChatActivity.this, "正在录音");
				chartMediaRecord.setText("正在录音...");
				media.startRecord();
				mediadialog.show();
				return false;
			}
		});
		chartMediaRecord.setOnTouchListener(new OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				switch (event.getAction()) {
				case MotionEvent.ACTION_UP:
					media.stopRecord();
					chartMediaRecord.setText("录音");
					mediadialog.dismiss();
					//显示录音,并发送给对方
					sendMediaRecord(media.name);
					break;
				}
				return false;
			}
		});
		tools=new Tools(this,Tools.ACTIVITY_CHART);
		//读取并清空新消息
		List<Msg> list=Tools.msgContainer.get(person.getIp());
		if(list!=null)
		{
			for(int i=0;i<list.size();i  )
			{
				if(list.get(i).getMsgType()==Tools.ISFILE)
				{
					//如果是语音文件
					receiveMedia(list.get(i));
				}
				else
				{
					//如果是信息
					receiveMsg(list.get(i));
				}
			}
			Tools.msgContainer.remove(person.getIp());
			Tools.currentUserIp=person.getIp();
		}
		proDia = new ProgressDialog(this);
		proDia.setTitle("文件发送");// 设置标题
		proDia.setMessage("文件");// 设置显示信息
		proDia.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);// 水平进度条
		proDia.setMax(100);// 设置最大进度指
		proDia.setProgress(10);// 开始点
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		//getMenuInflater().inflate(R.menu.chart, menu);
		menu.add(0, 1, 1, "发送文件");
        menu.add(0, 2, 2, "语音通话");
        return super.onCreateOptionsMenu(menu);
	}
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
        if(item.getItemId() == 1){
            //发送文件
			Intent it = new Intent(ChatActivity.this, FileAcitivity.class);
			ChatActivity.this.startActivityForResult(it, 1);
        }
        else if(item.getItemId() == 2){
            //语音通话
        	Tools.out("开始语音:" person.getIp());
			sendTalk();
        } 
        return true;
    }
	// 按钮点击事件
	@Override
	public void onClick(View v) {
		switch(v.getId())
		{
			case R.id.chart_msg_send:
				//发送信息按钮
				sendMsg();
				break; 
		}
	}
	// 发送录音
	public void sendMediaRecord(String name)
	{
		Tools.out("录音文件名:" name);
		Tools.currentPath=media.sendpath "/" name;
		//在view中显示,点击可以播放
		View view = getLayoutInflater().inflate(R.layout.send_msg_layout, null);
		TextView smcView = (TextView)view.findViewById(R.id.send_msg_content);
		TextView smtView = (TextView)view.findViewById(R.id.send_msg_time);
		TextView nView = (TextView)view.findViewById(R.id.send_nickename);
		ImageView senduserhead=(ImageView)view.findViewById(R.id.senduserhead);
		senduserhead.setImageResource(Tools.headIconIds[Tools.me.getHeadIconPos()]);
		MediaPlayer mp = MediaPlayer.create(ChatActivity.this, Uri.parse(media.sendpath "/" name));
		int duration = mp.getDuration()/1000;//即为时长 是ms 
		//得到录音时间
		smcView.setText(duration "″((");
		smcView.setTag(name);
		smcView.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				String mediaName=v.getTag().toString();
				//传入录音文件名并播放
				media.startPlay(media.sendpath "/" mediaName);
			}
		});
		smtView.setText(Tools.getChangeTime(Tools.getTimel()));
		nView.setText(Tools.me.getName());
		chartMsgPanel.addView(view);
		//通知准备发送录音
		String add=media.sendpath "/" name;
		String body=(new File(add)).getName() Tools.sign (new File(add)).length();
		Tools.out("body:" body);
		Msg msg=new Msg(Tools.me.getHeadIconPos(),Tools.me.getName(), Tools.me.getIp(), person.getName(), person.getIp(),Tools.CMD_SENDMEDIA, body);
		tools.sendMsg(msg);
		//更新滚动条
		mHandler.post(scrollRunnable);
	}
	// 发送语音
	public void sendTalk()
	{
		AlertDialog.Builder  builder = new AlertDialog.Builder(this);
		builder.setTitle(Tools.me.getName());
		builder.setMessage(person.getName());
		builder.setIcon(null);
		builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface cdialog, int which) {
				cdialog.dismiss();
				Tools.out("取消语音");
			}
		});
		callDialog = builder.show();
		callDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
			@Override
			public void onDismiss(DialogInterface arg0) {
				//发送结束呼叫请求
				Msg msg=new Msg();
				msg.setSendUser(Tools.me.getName());//昵称默认为自己的机器号
				msg.setSendUserIp(Tools.me.getIp());
				msg.setReceiveUserIp(person.getIp());
				msg.setMsgType(Tools.CMD_STOPTALK);//发送呼叫请求
				msg.setPackId(Tools.getTimel());
				tools.sendMsg(msg);
			}
		});
		//发送呼叫请求
		Msg msg=new Msg();
		msg.setSendUser(Tools.me.getName());//昵称默认为自己的机器号
		msg.setSendUserIp(Tools.me.getIp());
		msg.setReceiveUserIp(person.getIp());
		msg.setMsgType(Tools.CMD_STARTTALK);//发送呼叫请求
		msg.setPackId(Tools.getTimel());
		tools.sendMsg(msg);
		Tools.out("开始呼叫");
	}
	// 发送信息
	public void sendMsg()
	{
		String body = chartMsg.getText().toString();
		if(null==body || body.length()<=0){
			Toast.makeText(this,"不能为空", Toast.LENGTH_SHORT).show();
			return;
		}
		chartMsg.setText("");
		View view = getLayoutInflater().inflate(R.layout.send_msg_layout, null);
		TextView smcView = (TextView)view.findViewById(R.id.send_msg_content);
		TextView smtView = (TextView)view.findViewById(R.id.send_msg_time);
		TextView nView = (TextView)view.findViewById(R.id.send_nickename);
		ImageView senduserhead=(ImageView)view.findViewById(R.id.senduserhead);
		senduserhead.setImageResource(Tools.headIconIds[Tools.me.getHeadIconPos()]);
		Msg msg=new Msg(Tools.me.getHeadIconPos(),Tools.me.getName(), Tools.me.getIp(), person.getName(), person.getIp(),Tools.CMD_SENDMSG, body);
		smcView.setText(body);
		smtView.setText(Tools.getChangeTime(Tools.getTimel()));
		nView.setText(Tools.me.getName());
		chartMsgPanel.addView(view);
		tools.sendMsg(msg);
		//更新滚动条
		mHandler.post(scrollRunnable);
	}
	// 接收信息
	private void receiveMsg(Msg m)
	{
		View view = getLayoutInflater().inflate(R.layout.received_msg_layout, null);
		TextView smcView = (TextView)view.findViewById(R.id.received_msg_content);
		TextView smtView = (TextView)view.findViewById(R.id.received_msg_time);
		TextView nView = (TextView)view.findViewById(R.id.received_nickename);
		ImageView receiveIcon=(ImageView)view.findViewById(R.id.receiveuserhead);
		receiveIcon.setImageResource(Tools.headIconIds[m.getHeadIconPos()]);
		smcView.setText((String)m.getBody());
		smtView.setText(Tools.getChangeTime(Tools.getTimel()));
		nView.setText(m.getSendUser());
		chartMsgPanel.addView(view);
		mHandler.post(scrollRunnable);
	}
	// 接收录音
	private void receiveMedia(Msg m)
	{
		View view = getLayoutInflater().inflate(R.layout.received_msg_layout, null);
		TextView smcView = (TextView)view.findViewById(R.id.received_msg_content);
		TextView smtView = (TextView)view.findViewById(R.id.received_msg_time);
		TextView nView = (TextView)view.findViewById(R.id.received_nickename);
		ImageView receiveIcon=(ImageView)view.findViewById(R.id.receiveuserhead);
		receiveIcon.setImageResource(Tools.headIconIds[m.getHeadIconPos()]);
		String[] fileInfo = (m.getBody().toString()).split(Tools.sign);
		MediaPlayer mp = MediaPlayer.create(ChatActivity.this, Uri.parse(media.receivepath "/" fileInfo[0]));
		int duration = mp.getDuration()/1000;//即为时长 是ms 
		//得到录音时间
		smcView.setText(duration "″((");
		smcView.setTag(fileInfo[0]);
		smcView.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				String mediaName=v.getTag().toString();
				//传入录音文件名并播放
				media.startPlay(media.receivepath "/" mediaName);
			}
		});
		smtView.setText(Tools.getChangeTime(Tools.getTimel()));
		nView.setText(m.getSendUser());
		chartMsgPanel.addView(view);
		mHandler.post(scrollRunnable);
	}
	// 接收语音请求
	private void receiveCall(Msg msg)
	{
		if(!Tools.stoptalk){
			AlertDialog.Builder  builder = new AlertDialog.Builder(this);
			builder.setTitle("来自:" msg.getSendUser());
			builder.setMessage(null);
			builder.setIcon(null);
			View vi = getLayoutInflater().inflate(R.layout.request_talk_layout, null);
			builder.setView(vi);
			revTalkDialog = builder.show();
			revTalkDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
				@Override
				public void onDismiss(DialogInterface arg0) {
					//发送结束呼叫请求
					Msg msg=new Msg();
					msg.setSendUser(Tools.me.getName());//昵称默认为自己的机器号
					msg.setSendUserIp(Tools.me.getIp());
					msg.setReceiveUserIp(person.getIp());
					msg.setMsgType(Tools.CMD_STOPTALK);//发送呼叫请求
					msg.setPackId(Tools.getTimel());
					tools.sendMsg(msg);
				}
			});
			Button talkOkBtn = (Button)vi.findViewById(R.id.receive_talk_okbtn);
			talkOkBtn.setOnClickListener(new View.OnClickListener() {
				@Override
				public void onClick(View okBtn) {
					if(!Tools.stoptalk){//如果远程用户未关闭通话,则向对方发送同意接收通话指令
						Msg msg=new Msg();
						msg.setSendUser(Tools.me.getName());//昵称默认为自己的机器号
						msg.setSendUserIp(Tools.me.getIp());
						msg.setReceiveUserIp(person.getIp());
						msg.setMsgType(Tools.CMD_ACCEPTTALK);
						msg.setPackId(Tools.getTimel());
						tools.sendMsg(msg);
						okBtn.setEnabled(false);
						//同意接收并开始传输语音数据
						Tools.audio.audioSend(person);
					}
				}
			});
			Button talkCancelBtn = (Button)vi.findViewById(R.id.receive_talk_cancel);
			talkCancelBtn.setOnClickListener(new View.OnClickListener() {
				@Override
				public void onClick(View cancelBtn) {
					revTalkDialog.dismiss();
				}
			});
		}
	}
	// Handler
	public Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case Tools.SHOW:
				Toast.makeText(ChatActivity.this, (String) msg.obj,
						Toast.LENGTH_SHORT).show();
				break;
			case Tools.RECEIVEMSG:
				//接收消息
				receiveMsg((Msg)msg.obj);
				break;
			case Tools.CMD_STARTTALK:
				//语音请求
				receiveCall((Msg)msg.obj);
				break;
			case Tools.CMD_STOPTALK:
				//语音结束
				if(revTalkDialog!=null)
					revTalkDialog.dismiss();
				if(callDialog!=null)
					callDialog.dismiss();
				break;
			case Tools.CMD_FINISHMEDIA:
				//完成接收录音
				receiveMedia((Msg)msg.obj);
				break;
			case Tools.FILE_JINDU:
				String[] pi = ((String) msg.obj).split(Tools.sign);
				fileSize = Double.parseDouble(pi[2]);
				proDia.setTitle(pi[0]);// 设置标题
				proDia.setMessage(pi[1]   " 大小:"
						  FileAcitivity.getFormatSize(fileSize));// 设置显示信息
				proDia.onStart();
				proDia.show();
				break;
			case Tools.PROGRESS_FLUSH:
				int i0 = (int) ((Tools.sendProgress / (fileSize)) * 100);
				proDia.setProgress(i0);
				break;
			case Tools.PROGRESS_COL:// 关闭进度条
				proDia.dismiss();
				break;	
			}
		}
	};
	@Override
    protected void onResume() {
    	super.onResume();
		Tools.State=Tools.CHATACTIVITY;
    }
	@Override
    protected void onPause() {
    	super.onPause();
    	Tools.State=Tools.MAINACTIVITY;
    }
    @Override
    protected void onDestroy() {
    	super.onDestroy();
    	Tools.pretime=0;
    	Tools.out("destroy");
    	Tools.State=Tools.MAINACTIVITY;
    }    
    // 发送文件取得路径
 	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 		// TODO Auto-generated method stub
 		switch (resultCode) {
 		case RESULT_OK:
 			choosePath = data.getStringExtra("path");
 			Tools.out("文件路径:" choosePath);
 			//发送请求传送文件
 			Msg msg=new Msg(Tools.me.getHeadIconPos(),Tools.me.getName(), Tools.me.getIp(), person.getName(), person.getIp(),Tools.CMD_FILEREQUEST, 
 					(new File(choosePath)).getName() Tools.sign (new File(choosePath)).length());
 			tools.sendMsg(msg);
 			Tools.out("发送请求传送文件");
 		}
 	}
}

标签: 局域网 聊天

实例下载地址

android 局域网聊天

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警