实例介绍
【实例简介】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();
}
}
}
}
}
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)