android拍照
Android系统提供了相机API,使得开发者可以通过程序访问相机,实现拍照、录像等功能。本文将介绍Android相机的原理和使用方法。
1. 相机预览
相机预览是指在相机界面上显示相机所拍摄的实时画面。在Android中可以通过SurfaceView来实现相机预览。SurfaceView是一个可以在不阻塞UI线程的情况下在屏幕上显示图像的控件。在相机预览中,我们需要创建一个SurfaceView,并从相机获取预览数据,将预览数据绘制到SurfaceView上。
2. 拍照流程
拍照流程主要包括以下几个步骤:
(1)打开相机:使用Camera.open()方法打开相机。
(2)设置相机参数:通过Camera.Parameters来设置相机参数,如设置照片的分辨率、对焦模式、曝光等级等。
(3)预览相机画面:使用Camera.setPreviewDisplay()方法将相机预览数据绑定到SurfaceView上,然后调用Camera.startPreview()方法开始预览。
(4)拍照:调用Camera.takePicture()方法拍照。在拍照过程中,相机会停止预览并保存照片数据。
(5)保存照片:在拍照完成后,相机会返回照片数据。我们可以将照片保存到本地存储设备中。
3. 相机API介绍
(1)Camera类:Android中用于操作相机的主要类。可以通过Camera.open()方法获取相机实例。
(2)Camera.Parameters类:相机参数类,可以设置相机的各种参数,如照片分辨率、曝光等级、对焦模式等。
(3)SurfaceView类:用于在屏幕上显示相机预览数据。
(4)SurfaceHolder类:用于管理SurfaceView的生命周期和绘制过程。
(5)Camera.PictureCallback类:用于处理拍照后相机返回的照片数据。
4. 示例代码
以下是一个简单的拍照示例代码:
```java
public class CameraActivity extends Activity implements SurfaceHolder.Callback {
private Camera mCamera;
private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceHolder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
mSurfaceView = findViewById(R.id.surface_view);
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
try {
mCamera = Camera.open();
mCamera.setPreviewDisplay(surfaceHolder);
mCamera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
mCamera.stopPreview();
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPictureFormat(ImageFormat.JPEG);
parameters.setPreviewSize(640, 480);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
public void takePicture(View view) {
mCamera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] bytes, Camera camera) {
File file = new File(Environment.getExternalStorageDirectory(), "picture.jpg");
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(bytes);
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
mCamera.startPreview();
}
});
}
}
```
在上述代码中,我们使用SurfaceView来显示相机预览,通过SurfaceHolder.Callback来监听SurfaceView的生命周期和绘制过程。在surfaceCreated()方法中打开相机并将预览数据绑定到SurfaceView上,在surfaceChanged()方法中设置相机参数并开始预览。在takePicture()方法中调用Camera.takePicture()方法拍照,并在Camera.PictureCallback中处理相机返回的照片数据,将照片保存到本地存储设备中。