在安卓开发中,摄像头的使用是一个非常常见且重要的功能。无论是开发拍照应用、视频录制应用还是其他需要获取图像或视频数据的应用,都离不开对摄像头的操作。
在使用安卓摄像头之前,首先需要在AndroidManifest.xml文件中添加相关的权限。
创建Camera对象
import android.hardware.Camera;
public class MainActivity extends AppCompatActivity {
private Camera mCamera;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 打开后置摄像头,0表示后置摄像头,1表示前置摄像头
mCamera = Camera.open(0);
}
}
Camera2
API。不过,这里先以旧的Camera
API为例进行讲解。处理摄像头异常
Camera.open()
方法可能会抛出RuntimeException
。所以需要对其进行异常处理:try {
mCamera = Camera.open(0);
} catch (RuntimeException e) {
e.printStackTrace();
}
Camera.Parameters
类来获取摄像头支持的预览尺寸。Camera.Parameters parameters = mCamera.getParameters();
List<Camera.Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();
if (supportedPreviewSizes.size() > 0) {
Camera.Size previewSize = supportedPreviewSizes.get(0);
parameters.setPreviewSize(previewSize.width, previewSize.height);
mCamera.setParameters(parameters);
}
Camera.Parameters
类:List<Integer> supportedPictureFormats = parameters.getSupportedPictureFormats();
ImageFormat.JPEG
(用于拍摄JPEG格式的照片)等。parameters.setPictureFormat(ImageFormat.JPEG);
mCamera.setParameters(parameters);
Camera.Parameters
类:List<String> supportedFocusModes = parameters.getSupportedFocusModes();
Camera.Parameters.FOCUS_MODE_AUTO
(自动对焦)、Camera.Parameters.FOCUS_MODE_MACRO
(微距对焦,适用于近距离拍摄小物体)等。if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
mCamera.setParameters(parameters);
}
activity_main.xml
)中添加SurfaceView
:<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Activity
类中:SurfaceView surfaceView = findViewById(R.id.surfaceView);
SurfaceHolder surfaceHolder = surfaceView.getSurfaceHolder();
surfaceHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// 如果SurfaceView的大小发生变化,可以在这里重新设置预览参数
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
mCamera.release();
}
});
mCamera.takePicture()
方法拍照时,需要传入三个回调接口,分别用于处理拍照前的准备、拍摄的原始数据(一般不常用)和最终的JPEG格式照片数据。Camera.PictureCallback jpegCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// 这里可以将data保存为文件,例如保存到外部存储
File pictureFile = getOutputMediaFile();
if (pictureFile == null) {
return;
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
// 拍照后重新开始预览
camera.startPreview();
}
};
getOutputMediaFile()
方法是一个自定义的方法,用于创建一个用于保存照片的文件对象。mCamera.takePicture()
方法:public void takePhoto() {
mCamera.takePicture(null, null, jpegCallback);
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/27000514d67a46418c8b016b236403eb.png#pic_cente
MediaRecorder
对象,并进行相关设置。MediaRecorder mediaRecorder = new MediaRecorder();
mCamera.unlock();
mediaRecorder.setCamera(mCamera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
File videoFile = getOutputMediaFileForVideo();
mediaRecorder.setOutputFile(videoFile.getAbsolutePath());
try {
mediaRecorder.prepare();
mediaRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
mediaRecorder.stop();
mediaRecorder.reset();
mediaRecorder.release();
mCamera.lock();