该系统分为两部分,首先是局域网手机之间的视频传输(条件有限用手机摄像头代替模块),其次是手机蓝牙与arduino开发板的信息传输。代码注释较为详细,这里直接上代码。
客户端视频数据获取:
package com.example.kehuduan;
import android.graphics.ImageFormat;
import android.graphics.Rect;
import android.graphics.YuvImage;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import android.app.Activity;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
private static final int SEND = 0;
private static final int SEND1 = 1;
private MyHandler handler;
private ClientThread clientThread;
private Button start;
private Button stop;
private SurfaceView surfaceView;
private SurfaceHolder holder;
private Camera camera;
private EditText text;
private boolean isPreview = false; // 是否在浏览中
private int screenWidth = 300, screenHeight = 300;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置全屏
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
handler = new MyHandler();
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
screenWidth = dm.widthPixels;// 获取屏幕分辨率宽度
screenHeight = dm.heightPixels;
start = (Button) findViewById(R.id.start);
stop = (Button) findViewById(R.id.stop);
text = (EditText) findViewById(R.id.editText1);
text.setText("192.168.137.***");//设一个初始地址
surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
holder = surfaceView.getHolder();//为surfaceView提供一个可变的包装
holder.setFixedSize(320, 240);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//camera类给surfaceView提供预览数据图像改变起来会比较流畅
start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
String str = text.getText().toString().trim();//得到地址
clientThread = new ClientThread(handler, str);
start.setEnabled(false);
new Thread(clientThread).start();
}
});
stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
start.setEnabled(true);
}
});
holder.addCallback(new Callback() {
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
ItCamera();
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
if (camera != null) {
if (isPreview)
camera.stopPreview();
camera.release();
camera = null;
}
}
});
// 开启连接服务
}
private void ItCamera() {
if (!isPreview) {
camera = Camera.open();//可前置后置切换
ClientThread.