您查询的关键词是:android 聊天 软件 源码 
下面是原始网址 https://www.haolizi.net/example/view_3075.html 在 2020-02-15 12:16:05 的快照。

360搜索与该网页作者无关,不对其内容负责。

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

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

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:4.54M
  • 下载次数:176
  • 浏览次数:5348
  • 发布时间:2015-03-10
  • 实例类别:Android平台开发
  • 发 布 人:cheng330301560
  • 所需积分: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();
}
}
}
}
}

网友评论

第 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条评论>>

小贴士

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

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