在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → android视频聊天源码下载(wifi)

android视频聊天源码下载(wifi)

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:4.54M
  • 下载次数:198
  • 浏览次数:5821
  • 发布时间:2015-03-10
  • 实例类别:Android平台开发
  • 发 布 人:cheng330301560
  • 文件格式:.zip
  • 所需积分:1
 相关标签: Android 视频 聊天

实例介绍

【实例简介】支持 wifi下  视频 语音聊天

【实例截图】

【核心代码】

public class VideoChat extends Base implements SurfaceHolder.Callback, Camera.PreviewCallback,OnBitmapLoaded{
	
	private SurfaceHolder surfaceHolder;
	private SurfaceView surfaceView;
	private Camera camera;
	
	private VideoView myView;
	
	private String chatterIP;//记录当前用户ip
	//线程池,用来发送图片数据
	private ExecutorService executors=Executors.newFixedThreadPool(TCPVideoReceiveListener.THREAD_COUNT);
	
	 final int REFRESH=0; 
	 
	 
	 private int port=Constant.VIDEO_PORT;
	 
	 private TCPVideoReceiveListener videoReceiveListener;
	 private UDPVoiceListener voiceListener;
	 
	 private boolean stop;//标识activity被遮挡
	 
	private Handler handler=new Handler(){
		public void handleMessage(android.os.Message msg) {
			myView.setBitmap((Bitmap)msg.obj);
		};
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.video_chat1);
		findViews();
		chatterIP=getIntent().getStringExtra("IP");
		try {
			voiceListener=UDPVoiceListener.getInstance(InetAddress.getByName(chatterIP));
			 voiceListener.open();
		} catch (Exception e) {
			e.printStackTrace();
			showToast("抱歉,语音聊天器打开失败");
			try {
				voiceListener.close();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
		 
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					videoReceiveListener=TCPVideoReceiveListener.getInstance();
					videoReceiveListener.setBitmapLoaded(VideoChat.this);
					if(!videoReceiveListener.isRunning())
						videoReceiveListener.open();//先监听端口,然后连接
				} catch (IOException e1) {
					e1.printStackTrace();
					runOnUiThread(new Runnable() {
						@Override
						public void run() {
							showToast("非常抱歉,视屏连接失败");
							finish();
						}
					});
				}				
			}
		}).start();
		 SpotManager.getInstance(this).showSpotAds(this);
	}
	
	private void findViews(){
		surfaceView=(SurfaceView) findViewById(R.id.video_chat_preview);
		surfaceHolder=surfaceView.getHolder();
		surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		surfaceHolder.addCallback(this);
		myView=(VideoView) findViewById(R.id.video_chat_myview);
		TextView topTitle=(TextView) findViewById(R.id.toptextView);
		topTitle.setText(getIntent().getStringExtra("name"));
	}
	
	@Override
	protected void onPause() {
		stop=true;
		super.onPause();
	}

	@Override
	public void onPreviewFrame(final byte[] data, final Camera camera) {
		executors.execute(new Runnable() {
			@Override
			public void run() {
				try {
					Socket socket=new Socket(InetAddress.getByName(chatterIP), port);
					OutputStream out=socket.getOutputStream();
					
				   YuvImage image = new YuvImage(data, PreviewFormat, w, h, null);
				   ByteArrayOutputStream os = new ByteArrayOutputStream();
				   Rect rect=new Rect(0, 0, w, h);
				   //1:将YUV数据格式转化成jpeg
		           if(!image.compressToJpeg(rect, 100, os))  return ;
		           
		           //2:将得到的字节数组压缩成bitmap
		            Bitmap bmp = Util.decodeVideoBitmap(os.toByteArray(), 200);
//		            Bitmap bmp = Util.decodeSampledBitmapFromFile(os.toByteArray(), 200, 200);
//		           Bitmap bmp=BitmapFactory.decodeByteArray(data, offset, length, opts)
		            Matrix matrix=new Matrix();
		            matrix.setRotate(-90);
//		            matrix.postScale(2.0f, 2.0f);
		            //3:旋转90
		            bmp=Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
		            //4:将最后的bitmap转化为字节流发送
		            ByteArrayOutputStream baos = new ByteArrayOutputStream();    
		            bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);   
		            out.write(baos.toByteArray());
		            out.flush();
		            out.close();
		            socket.close();
				}  catch (IOException e) {
					e.printStackTrace();
				}
			}
		});
	}
	
	@Override
	public void onBitmapLoaded(Bitmap bitmap) {
		handler.sendMessage(handler.obtainMessage(REFRESH, bitmap));
		if(stop){
			    try {
			    	//代码实现模拟用户按下back键
			    	String keyCommand = "input keyevent "   KeyEvent.KEYCODE_BACK;  
			    	Runtime runtime = Runtime.getRuntime();  
					runtime.exec(keyCommand);
					stop=false;
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}
	
	
	
	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		int cameras=Camera.getNumberOfCameras();
		CameraInfo info=new CameraInfo();
		for(int i=0;i<cameras;i  ){
			Camera.getCameraInfo(i, info);
			if(info.facing==CameraInfo.CAMERA_FACING_FRONT){
				camera=Camera.open(i);
				break;
			}
		}
		//没有前置摄像头
		if(camera==null) camera=Camera.open();
		try {
			camera.setPreviewDisplay(surfaceHolder);
			camera.setPreviewCallback(this);
		} catch (Exception e) {
			camera.release();//释放资源
			camera=null;
		}
	}
	
	
     int w ;  //宽度
     int h;
     int PreviewFormat;
	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
		Camera.Parameters parameters=camera.getParameters();//得到相机设置参数
		Size size = camera.getParameters().getPreviewSize(); //获取预览大小
		w=size.width;
		h=size.height;
		parameters.setPictureFormat(PixelFormat.JPEG);//设置图片格式
		PreviewFormat=parameters.getPreviewFormat();
	    setDisplayOrientation(camera, 90);
//		 if (Integer.parseInt(Build.VERSION.SDK) >= 8) {
//		      setDisplayOrientation(camera, 90);
//		    } else {
//		      if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
//		        parameters.set("orientation", "portrait");
//		        parameters.set("rotation", 90);
//		      }else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
//		        parameters.set("orientation", "landscape");
//		        parameters.set("rotation", 90);
//		      }
//		    }
	    camera.setPreviewCallback(this);
		camera.setParameters(parameters);
		camera.startPreview();//开始预览
	}


	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		if(camera!=null){
			camera.setPreviewCallback(null);
			camera.stopPreview();
			camera.release();
			camera=null;
		}
	}
	
	protected void setDisplayOrientation(Camera camera, int angle) {
	    try {
	    	Method downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[] { int.class });
		    if (downPolymorphic != null) 
		        downPolymorphic.invoke(camera, new Object[] { angle });
	    } catch (Exception e1) {
	      e1.printStackTrace();
	    }
	  }
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		try {
			videoReceiveListener.close();
			voiceListener.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	 * socket池,用来缓存
	 */
	@Deprecated
	class SocketPool extends Thread{
		private List<Socket> sockets=new LinkedList<Socket>();
		private final int poolSize=30; 
		private boolean go=true;
		
		@Override
		public void run() {
			InetAddress address = null;
			try {
				address = InetAddress.getByName(chatterIP);
				while(go){
					int count=sockets.size();
					if(count<poolSize){
						for(int i=0;i<poolSize-count;i  ){
							sockets.add(new Socket(address, port));
						}
					}
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		public Socket getSocket(){
			if(!sockets.isEmpty()){
				Socket socket=sockets.get(0);
				sockets.remove(0);
				return socket;
			}
			return null;
		}
		
		public void close(){
			go=false;
			for(Socket socket:sockets){
				try {
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

标签: Android 视频 聊天

实例下载地址

android视频聊天源码下载(wifi)

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

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

网友评论

第 1 楼 君子不爱兰 发表于: 2016-02-22 10:16 23
能运行 但是全是BUG

支持(0) 盖楼(回复)

第 2 楼 君子不爱兰 发表于: 2016-02-22 10:16 31
能运行 但是全是BUG

支持(0) 盖楼(回复)

第 3 楼 MinDawn 发表于: 2017-07-14 06:39 56
试一下

支持(0) 盖楼(回复)

第 4 楼 qan0107 发表于: 2018-03-20 16:19 28
试一下

MinDawn 2017-07-14 06:39 56

能发我吗

支持(0) 盖楼(回复)

发表评论

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

查看所有4条评论>>

小贴士

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

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

关于好例子网

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

;
报警