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

android 视频对讲 例子源码下载

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:1.04M
  • 下载次数:84
  • 浏览次数:2002
  • 发布时间:2015-04-12
  • 实例类别:Android平台开发
  • 发 布 人:晴天霹雳!
  • 文件格式:.rar
  • 所需积分:2
 相关标签: 安卓 视频对讲

实例介绍

【实例简介】Android版视频会议是Web版视频会议系统的移动版,它构建在Android手机上,主要提供Web版视频会议系统中的一系列的提醒功能,如站内短信、视频会议提醒以及待办事宜等。
【实例截图】

【核心代码】


publicclassVideoChatextendsBaseimplementsSurfaceHolder.Callback, Camera.PreviewCallback,OnBitmapLoaded{
     
    privateSurfaceHolder surfaceHolder;
    privateSurfaceView surfaceView;
    privateCamera camera;
     
    privateVideoView myView;
     
    privateString chatterIP;//记录当前用户ip
    //线程池,用来发送图片数据
    privateExecutorService executors=Executors.newFixedThreadPool(TCPVideoReceiveListener.THREAD_COUNT);
     
     finalintREFRESH=0;
      
      
     privateintport=Constant.VIDEO_PORT;
      
     privateTCPVideoReceiveListener videoReceiveListener;
     privateUDPVoiceListener voiceListener;
      
     privatebooleanstop;//标识activity被遮挡
      
    privateHandler handler=newHandler(){
        publicvoidhandleMessage(android.os.Message msg) {
            myView.setBitmap((Bitmap)msg.obj);
        };
    };
     
    @Override
    protectedvoidonCreate(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();
            }
        }
          
         
        newThread(newRunnable() {
            @Override
            publicvoidrun() {
                try{
                    videoReceiveListener=TCPVideoReceiveListener.getInstance();
                    videoReceiveListener.setBitmapLoaded(VideoChat.this);
                    if(!videoReceiveListener.isRunning())
                        videoReceiveListener.open();//先监听端口,然后连接
                }catch(IOException e1) {
                    e1.printStackTrace();
                    runOnUiThread(newRunnable() {
                        @Override
                        publicvoidrun() {
                            showToast("非常抱歉,视屏连接失败");
                            finish();
                        }
                    });
                }              
            }
        }).start();
         SpotManager.getInstance(this).showSpotAds(this);
    }
     
    privatevoidfindViews(){
        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
    protectedvoidonPause() {
        stop=true;
        super.onPause();
    }
 
    @Override
    publicvoidonPreviewFrame(finalbyte[] data,finalCamera camera) {
        executors.execute(newRunnable() {
            @Override
            publicvoidrun() {
                try{
                    Socket socket=newSocket(InetAddress.getByName(chatterIP), port);
                    OutputStream out=socket.getOutputStream();
                     
                   YuvImage image =newYuvImage(data, PreviewFormat, w, h,null);
                   ByteArrayOutputStream os =newByteArrayOutputStream();
                   Rect rect=newRect(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=newMatrix();
                    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 =newByteArrayOutputStream();   
                    bmp.compress(Bitmap.CompressFormat.JPEG,100, baos);  
                    out.write(baos.toByteArray());
                    out.flush();
                    out.close();
                    socket.close();
                } catch(IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
     
    @Override
    publicvoidonBitmapLoaded(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
    publicvoidsurfaceCreated(SurfaceHolder holder) {
        intcameras=Camera.getNumberOfCameras();
        CameraInfo info=newCameraInfo();
        for(inti=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;
        }
    }
     
     
     intw ; //宽度
     inth;
     intPreviewFormat;
    @Override
    publicvoidsurfaceChanged(SurfaceHolder holder,intformat,intwidth,intheight) {
        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
    publicvoidsurfaceDestroyed(SurfaceHolder holder) {
        if(camera!=null){
            camera.setPreviewCallback(null);
            camera.stopPreview();
            camera.release();
            camera=null;
        }
    }
     
    protectedvoidsetDisplayOrientation(Camera camera,intangle) {
        try{
            Method downPolymorphic = camera.getClass().getMethod("setDisplayOrientation",newClass[] {int.class});
            if(downPolymorphic !=null)
                downPolymorphic.invoke(camera,newObject[] { angle });
        }catch(Exception e1) {
          e1.printStackTrace();
        }
      }
     
    @Override
    protectedvoidonDestroy() {
        super.onDestroy();
        try{
            videoReceiveListener.close();
            voiceListener.close();
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
     
     
    /**
     * socket池,用来缓存
     */
    @Deprecated
    classSocketPoolextendsThread{
        privateList<Socket> sockets=newLinkedList<Socket>();
        privatefinalintpoolSize=30;
        privatebooleango=true;
         
        @Override
        publicvoidrun() {
            InetAddress address =null;
            try{
                address = InetAddress.getByName(chatterIP);
                while(go){
                    intcount=sockets.size();
                    if(count<poolSize){
                        for(inti=0;i<poolSize-count;i  ){
                            sockets.add(newSocket(address, port));
                        }
                    }
                }
            }catch(IOException e) {
                e.printStackTrace();
            }
        }
         
        publicSocket getSocket(){
            if(!sockets.isEmpty()){
                Socket socket=sockets.get(0);
                sockets.remove(0);
                returnsocket;
            }
            returnnull;
        }
         
        publicvoidclose(){
            go=false;
            for(Socket socket:sockets){
                try{
                    socket.close();
                }catch(IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}


标签: 安卓 视频对讲

实例下载地址

android 视频对讲 例子源码下载

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

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

网友评论

第 1 楼 猫九先森 发表于: 2017-08-26 12:02 51
特么局域网还要视屏聊天语音聊天。。。。。。。。。。。。

支持(0) 盖楼(回复)

发表评论

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

查看所有1条评论>>

小贴士

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

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

关于好例子网

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

;
报警