Android系统提供了丰富的摄像头相关API,开发者可以通过调用系统API和自定义相机的方式来使用摄像头拍照。

一、调用系统相机
调用系统相机拍照是最简单的方法,通过隐式调用系统自带的相机应用,可以实现拍照并返回拍照后的图片。
1. 准备工作
为了处理相机应用的返回结果,需要在AndroidManifest.xml文件中声明一个activity,并添加相应的intent-filter。
android:name=".CameraResultActivity" android:label="@string/app_name">
2. 调起相机应用
下面是一个实现打开相机拍照的例子。
private static final int REQUEST_CODE_TAKE_PHOTO = 1000;
private void takePhoto() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, REQUEST_CODE_TAKE_PHOTO);
} else {
Toast.makeText(this, "没有相机应用", Toast.LENGTH_SHORT).show();
}
}
3. 处理返回结果
拍照完成后,系统会将图片保存到默认的位置,并将其路径返回给调用者。可以通过`onActivityResult`方法来处理返回结果,获取图片的路径并显示。
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (requestCode == REQUEST_CODE_TAKE_PHOTO && resultCode == RESULT_OK) {
if (data != null) {
Uri uri = data.getData();
if (uri != null) {
String filePath = UriUtils.getPath(this, uri);
if (!TextUtils.isEmpty(filePath)) {
// 显示图片
}
}
}
}
}
二、使用自定义相机
自定义相机可以实现更多的定制化功能,如设置拍照时的分辨率、拍照后处理等等。下面是一个自定义相机的实现例子。
1. 准备工作
在AndroidManifest.xml文件中添加相机和权限相关的声明。
android:minSdkVersion="21" android:targetSdkVersion="30" /> 在布局文件中添加一个SurfaceView来显示相机预览画面。 android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent" /> 2. 实现自定义相机 在调用自定义相机之前,需要先获取相机实例。 mCamera = CameraUtils.getCameraInstance(); 在获取相机实例后,需要通过`mCamera.setPreviewDisplay(holder)`将相机预览画面绑定到SurfaceView上。 try { mCamera.setPreviewDisplay(holder); } catch (IOException e) { e.printStackTrace(); } 接着需要配置相机参数,例如设置拍照分辨率、自动对焦等。 Camera.Parameters parameters = mCamera.getParameters(); parameters.setPictureFormat(ImageFormat.JPEG); parameters.setJpegQuality(100); parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); List Camera.Size size = CameraUtils.getOptimalPictureSize(sizes, 1920, 1080); parameters.setPictureSize(size.width, size.height); mCamera.setParameters(parameters); 最后调用`mCamera.startPreview()`来启动预览画面。可以通过`mCamera.takePicture()`方法来拍照,拍照完成后会回调`Camera.PictureCallback`接口的方法,其中`data`参数便是拍照后得到的图片数据。 mCamera.takePicture(null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // 处理图片数据 } }); 需要注意的是,在调用拍照方法之后,需要调用`mCamera.stopPreview()`来停止预览画面。 三、注意事项 1. 调起系统相机时,需要检查是否有相机应用存在。 2. 拍照完成后,需要处理返回结果,并将图片显示到UI上。 3. 自定义相机时,需要先获取相机实例并绑定预览画面,然后配置相机参数并启动预览画面。 4. 拍照后需要调用`mCamera.stopPreview()`来停止预览画面。 5. 调用相机时需要添加相关的权限声明。

查看详情

查看详情