要写一个基本功能的Camera应用其实很简单。
一.布局文件:
main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<SurfaceView
android:id="@+id/preview"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<RelativeLayout/>
二.主程序:
1.打开Camera:
mCamera = Camera.open(cameraId);//cameraId对应的是前后摄像头。
2.获取显示界面。
setContentView(R.layout.main);
surfaceView = (SurfaceView) findViewById(R.id.preview);
surfaceView.getHolder().addCallback(this);
3.设置相关参数:
private void setParams() {
Log.d(TAG, "setParams");
parameters = mCamera.getParameters();
parameters.setPreviewSize(960, 540);//根据需要进行改变。
parameters.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
parameters.setPictureSize(4096, 2304);//根据需要进行改变
mCamera.setParameters(parameters);
}
4.开始预览:
1).预览的时候由于要进行界面显示, 所以要设置一个显示界面, 就要用到我们上面的SurfaceView。
在步骤2中,surfaceView.getHolder().addCallback(this);//主Activity继承了SurfaceHolder.Callback, 设置了Surface的回调的接口SurfaceHolder.Callback, 在Surface创建过程中将会回调以下的方法:
@Override
public void surfaceCreated(SurfaceHolder holder) {//创建成功
Log.d(TAG, "surfaceCreated");
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,//SurfaceView的size改变
int height) {
Log.d(TAG, "surfaceChanged:" + width + "," + height);
mSurfaceHolder = holder;
startPreview(false);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {//销毁。
Log.d(TAG, "surfaceDestroyed");
}
2). startPreview:
在进行startPreview之间的两个必要条件就是一.Camera已经被打开。 二.Surfaceview创建成功.
所以在surfaceCreated和surfaceChanged中都可以进行startPreview。
private void startPreview(boolean reuse) {
if (camera != null && mSurfaceHolder != null) {
try {
if (!reuse) {
setParams();
mCamera.setDisplayOrientation(Util
.getCameraDisplayOrientation(this, cameraid));//设置预览显示的方向, 有可能是横屏或竖屏。
mCamera.setPreviewDisplay(mSurfaceHolder);
}
mCamera.startPreview();
} catch (Exception e) {
e.printStackTrace();
}
}
}
三。总结:
经过上面及步骤camera的基本预览功能已经实现。 在添加一个拍照的回调接口,就可以进行拍照了。
实现Camera的基本功能很简单, 但是一个完整的Camera功能涉及到很多复杂的参数和配置, 以及UI界面的美观,和一些特效的设置。 要做一个高质量Camera既要界面美观又要速度快,还要拍照质量好这就涉及到很多的问题, 很多问题只在app层是不能够解决。 由于本系列的文章主要是分析camera如何显示画面的, 所以暂不分析其他的东西。
从上面可以看到显示的关键点:mCamera.setPreviewDisplay(mSurfaceHolder);
下一篇就接着mCamera.setPreviewDisplay(mSurfaceHolder);函数往下分析。