public class MainActivity extends Activity implements Camera.PreviewCallback {
private static final String TAG = “MainActivity”;
private boolean isOpen;
private Camera mCamera;
private static final int width = 400;
private static final int height = 300;
private ByteArrayOutputStream jpegOutputSteam = new ByteArrayOutputStream();
ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(“MainActivity”, “onCreate: hello world”);
iv = new ImageView(this);
getWindow().addContentView(iv, new ViewGroup.LayoutParams(width, height));
}
public void onClickMenu(View view) {
Log.e(TAG,"startCamera");
new Thread() {
@Override
public void run() {
startCamera();
}
}.start();
}
public void startCamera() {
Log.i(TAG, "startCamera: ***************************************************");
if (isOpen) return;
else isOpen = true;
try {
mCamera = Camera.open(0);
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(width, height);
// parameters.setPreviewFrameRate(11);
mCamera.setParameters(parameters);
mCamera.startPreview();
// recorder.start();
mCamera.setPreviewCallback(this);
// mCamera.setPreviewDisplay(holder);
} catch (Exception e) {
Log.w(TAG, "startCamera: ", e);
stopCamera();
}
}
public void stopCamera() {
if (!isOpen) return;
if (null != mCamera) {
try {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
} catch (Exception e) {
Log.e(TAG, "stopCamera: ", e);
}
}
System.gc();
Log.i(TAG, "stopCamera: ***************************************************");
}
public boolean isOpen() {
return isOpen;
}
@Override
public void onPreviewFrame(byte[] bytes, Camera camera) {
try {
byte[] jpeg = getJpeg(bytes);
Log.i(TAG, "onPreviewFrame show jpeg....");
Bitmap bitmap = BitmapFactory.decodeByteArray(jpeg, 0, jpeg.length);
iv.setImageBitmap(bitmap);
} catch (Exception e) {
Log.w(TAG, "onPreviewFrame: ", e);
}
}
/**
* 将原始相机预览帧,转换成jpeg图片格式的byte[]
*
* @param bytes 原始相机预览帧
* @return jpeg图片格式的byte[]
* @throws IOException jpegOutputSteam.write();
*/
private byte[] getJpeg(byte[] bytes) throws IOException {
jpegOutputSteam.reset();
YuvImage image = new YuvImage(bytes, ImageFormat.NV21, width, height, null); //ImageFormat.NV21 640 480
image.compressToJpeg(new Rect(0, 0, image.getWidth(), image.getHeight()), 100, jpegOutputSteam); // 将NV21格式图片,以质量70压缩成Jpeg,并得到JPEG数据流
return jpegOutputSteam.toByteArray();
}
}