Android11拍照后保存照片实现教程
介绍
在Android开发中,实现拍照并保存照片是一个常见的需求。本文将教会你如何在Android11上实现拍照后保存照片的功能。我们将按照以下步骤进行操作:
步骤 | 描述 |
---|---|
步骤一 | 创建相机预览界面 |
步骤二 | 设备权限检查与请求 |
步骤三 | 拍照功能实现 |
步骤四 | 保存照片到设备 |
步骤一:创建相机预览界面
首先,我们需要创建一个相机预览界面,让用户能够看到拍摄的图像。这可以通过使用CameraView
或TextureView
来实现。在这里,我们选择使用TextureView
。
在XML布局文件中添加TextureView
:
<TextureView
android:id="@+id/textureView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
在Java代码中找到TextureView
并进行初始化:
TextureView textureView = findViewById(R.id.textureView);
步骤二:设备权限检查与请求
在Android11及以上的版本中,我们需要动态请求相机权限。为了实现这一点,我们需要检查并请求相机权限。
首先,在AndroidManifest.xml
文件中添加相机权限:
<uses-permission android:name="android.permission.CAMERA" />
然后,在Java代码中检查并请求相机权限:
private static final int REQUEST_CAMERA_PERMISSION = 200;
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
} else {
// 已经有相机权限,进行下一步操作
}
确保在onRequestPermissionsResult
方法中处理权限请求的结果:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQUEST_CAMERA_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 相机权限已授予,进行下一步操作
} else {
// 用户拒绝了相机权限请求,处理相应逻辑
}
}
}
步骤三:拍照功能实现
在这一步中,我们将实现拍照的功能。我们需要使用Camera
类或者CameraX
库来实现相机功能。
首先,获取相机设备:
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String cameraId = cameraManager.getCameraIdList()[0]; // 获取第一个相机设备
然后,配置相机的预览界面:
SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
surfaceTexture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight());
Surface surface = new Surface(surfaceTexture);
cameraManager.openCamera(cameraId, new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice camera) {
// 相机已打开,进行下一步操作
}
@Override
public void onDisconnected(@NonNull CameraDevice camera) {
// 相机连接断开,处理相应逻辑
}
@Override
public void onError(@NonNull CameraDevice camera, int error) {
// 相机打开错误,处理相应逻辑
}
}, null);
接下来,创建CaptureRequest
和CaptureSession
对象,并进行拍照操作:
private CameraCaptureSession cameraCaptureSession;
private CaptureRequest.Builder captureRequestBuilder;
camera.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
cameraCaptureSession = session;
try {
captureRequestBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
captureRequestBuilder.addTarget(surface);
// 设置自动对焦模式
captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
// 设置自动曝光模式
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
cameraCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null);
} catch (CameraAccessException e)