Android调用摄像头
在Android应用开发中,调用摄像头是一个常见的需求。本文将以详细的步骤和代码示例,教你如何在Android中实现调用摄像头功能。
步骤概览
下表展示了实现"Android调用摄像头"的整个流程,包括权限申请、摄像头调用和获取拍摄照片。
步骤 | 操作 |
---|---|
1. 添加权限 | 添加相机权限到AndroidManifest.xml文件中 |
2. 创建布局 | 在布局文件中添加一个SurfaceView用于显示摄像头预览画面 |
3. 初始化摄像头 | 在Activity的onCreate方法中初始化摄像头,获取摄像头实例和配置摄像头参数 |
4. 显示摄像头预览 | 在SurfaceView的SurfaceHolder.Callback中实现surfaceCreated和surfaceDestroyed方法,用于显示和停止显示摄像头预览画面 |
5. 拍照 | 在拍照按钮的点击事件中调用摄像头的takePicture方法进行拍照操作 |
6. 保存照片到本地 | 在Camera.PictureCallback的onPictureTaken方法中保存照片到本地文件系统 |
代码示例
添加权限
首先,你需要在AndroidManifest.xml文件中添加相机权限。在<manifest>标签中添加以下代码:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
创建布局
在你的布局文件中,添加一个SurfaceView用于显示摄像头预览画面。例如,在activity_main.xml中添加以下代码:
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
初始化摄像头
在Activity的onCreate方法中,初始化摄像头,获取摄像头实例并配置摄像头参数。在MainActivity.java中添加以下代码:
private Camera camera;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化摄像头
camera = Camera.open();
Camera.Parameters parameters = camera.getParameters();
// 配置摄像头参数
camera.setParameters(parameters);
}
显示摄像头预览
为了显示摄像头的预览画面,你需要在SurfaceView的SurfaceHolder.Callback中实现surfaceCreated和surfaceDestroyed方法。在MainActivity.java中添加以下代码:
private SurfaceHolder surfaceHolder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SurfaceView surfaceView = findViewById(R.id.surfaceView);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 在Surface创建时调用,开始显示摄像头预览画面
try {
camera.setPreviewDisplay(holder);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// 在Surface大小或格式发生变化时调用
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// 在Surface销毁时调用,停止显示摄像头预览画面
camera.stopPreview();
camera.release();
}
});
}
拍照
在拍照按钮的点击事件中,调用摄像头的takePicture方法进行拍照操作。在MainActivity.java中添加以下代码:
private Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// 在拍照完成时调用,可以在这里处理照片数据
// 例如,保存照片到本地文件系统
File pictureFile = new File(getExternalFilesDir(null), "photo.jpg");
try (FileOutputStream fos = new FileOutputStream(pictureFile)) {
fos.write(data);
Toast.makeText(MainActivity.this, "照片保存成功", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(MainActivity.this, "照片保存失败", Toast.LENGTH_SHORT).show();
}