android捕捉相机拍照的动作
在本文中,我们将讨论如何在ndroid应用程序中捕捉相机拍照的动作。我们将涵盖如何使用ndroid相机PI来启动相机应用程序、配置相机参数并捕捉照片。我们还将讨论如何处理拍照后的照片并将其保存在设备上。
1. 启动相机应用程序
要启动相机应用程序,我们需要使用ndroid相机PI中的Intent。Intent是ndroid应用程序之间进行通信的一种机制。我们可以使用Intent来启动其他应用程序,例如相机应用程序。
以下是使用Intent启动相机应用程序的示例代码
```java
private static final int REUEST_IMGE_CPTURE = 1;
private void dispatchTakePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.CTION_IMGE_CPTURE);
if (takePictureIntent.resolvectivity(getPackageManager()) != null) {
startctivityForResult(takePictureIntent, REUEST_IMGE_CPTURE);我们首先创建一个Intent对象,该对象使用MediaStore.CTION_IMGE_CPTURE作为ction。这告诉ndroid系统我们要启动相机应用程序来捕捉照片。我们使用resolvectivity()方法检查设备上是否安装了相机应用程序。如果设备上安装了相机应用程序,则我们可以使用startctivityForResult()方法启动相机应用程序。
2. 配置相机参数
在启动相机应用程序后,我们需要配置相机参数。我们可以使用CameraManager和CameraDevice类来配置相机参数。
以下是使用CameraManager和CameraDevice类配置相机参数的示例代码
```java
private String mCameraId;
private Size mImageSize;
private ImageReader mImageReader;
private CameraDevice mCameraDevice;
private void openCamera() {
CameraManager manager = (CameraManager) getSystemService(Context.CMER_SERVICE);
try {
mCameraId = manager.getCameraIdList()[0];
CameraCharacteristics characteristics = manager.getCameraCharacteristics(mCameraId);
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCLER_STREM_CONFIGURTION_MP);
mImageSize = map.getOutputSizes(SurfaceTexture.class)[0];
mImageReader = ImageReader.newInstance(mImageSize.getWidth(), mImageSize.getHeight(), ImageFormat.JPEG, 1);
mImageReader.setOnImagevailableListener(mOnImagevailableListener,
if (ctivityCompat.checkSelfPermission(this, Manifest.permission.CMER) != PackageManager.PERMISSION_GRNTED) {
return;
}
manager.openCamera(mCameraId, mStateCallback,
}
private CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice camera) {
mCameraDevice = camera;
createCameraPreviewSession();
}
@Override
public void onDisconnected(@NonNull CameraDevice camera) {
camera.close();
mCameraDevice = null;
}
@Override
public void onError(@NonNull CameraDevice camera, int error) {
camera.close();
mCameraDevice = null;我们首先使用CameraManager类获取设备上的相机列表。我们使用getCameraCharacteristics()方法获取相机的特性。我们使用getOutputSizes()方法获取可用的照片尺寸,并选择其中的一个尺寸作为我们要捕捉的照片尺寸。我们还使用ImageReader类创建一个ImageReader对象,该对象用于捕捉照片。我们还设置了ImageReader.OnImagevailableListener监听器,以便在照片可用时接收通知。
接下来,我们使用CameraManager类的openCamera()方法打开相机。在相机打开后,我们使用CameraDevice.StateCallback回调接口处理相机状态。在onOpened()回调方法中,我们保存CameraDevice对象,并调用createCameraPreviewSession()方法创建相机预览会话。
3. 捕捉照片
在相机预览会话创建后,我们可以使用CaptureRequest.Builder类捕捉照片。
以下是使用CaptureRequest.Builder类捕捉照片的示例代码
```java
private CaptureRequest.Builder mPreviewRequestBuilder;
private CameraCaptureSession mCaptureSession;
private void createCameraPreviewSession() {
try {
SurfaceTexture texture = mTextureView.getSurfaceTexture();
assert texture != null;
texture.setDefaultBufferSize(mImageSize.getWidth(), mImageSize.getHeight());
Surface surface = new Surface(texture);
mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLTE_PREVIEW);
mPreviewRequestBuilder.addTarget(surface);
mCameraDevice.createCaptureSession(rrays.asList(surface, mImageReader.getSurface()), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
if (mCameraDevice == null) {
return;
}
mCaptureSession = session;
try {
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_F_MODE, CaptureRequest.CONTROL_F_MODE_CONTINUOUS_PICTURE);
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_E_MODE, CaptureRequest.CONTROL_E_MODE_ON_UTO_FLSH);
mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), null,
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
Toast.makeText(Mainctivity.this, "Failed", Toast.LENGTH_SHORT).show();
}
}, null);我们首先使用TextureView类获取SurfaceTexture对象。我们使用setDefaultBufferSize()方法设置SurfaceTexture的大小。接下来,我们创建一个Surface对象,并将其添加到CaptureRequest.Builder对象中。我们还将ImageReader的Surface对象添加到CaptureRequest.Builder对象中,以便在捕捉照片时将照片写入ImageReader对象。
在CameraCaptureSession.StateCallback回调接口的onConfigured()方法中,我们设置捕捉照片的参数,并使用setRepeatingRequest()方法开始捕捉照片。
4. 处理拍照后的照片
在捕捉照片后,我们需要处理拍照后的照片。我们可以使用ImageReader.OnImagevailableListener监听器来处理照片。
以下是使用ImageReader.OnImagevailableListener监听器处理照片的示例代码
```java
private File mFile;
private ImageReader.OnImagevailableListener mOnImagevailableListener = new ImageReader.OnImagevailableListener() {
@Override
public void onImagevailable(ImageReader reader) {
mBackgroundHandler.post(new ImageSaver(reader.acquireLatestImage()));
}
private class ImageSaver implements Runnable {
private final Image mImage;
}
@Override
public void run() {
ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);
FileOutputStream output = null;
try {
mFile = createImageFile();
output = new FileOutputStream(mFile);
output.write(bytes);
} catch (IOException e) {
e.printStackTrace();
} finally {
mImage.close();
if (output != null) {
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private File createImageFile() throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
在上面的代码中,我们首先创建一个ImageReader.OnImagevailableListener监听器,以便在照片可用时接收通知。在onImagevailable()方法中,我们使用ImageSaver类将照片写入文件。
在ImageSaver类中,我们首先获取照片的字节数组,并将其写入文件。我们使用createImageFile()方法创建一个临时文件来保存照片。该方法使用getExternalFilesDir()方法获取应用程序的外部存储目录,并使用File.createTempFile()方法创建一个临时文件。
5. 总结
在本文中,我们讨论了如何在ndroid应用程序中捕捉相机拍照的动作。我们使用了ndroid相机PI中的Intent、CameraManager、CameraDevice、CaptureRequest.Builder和ImageReader等类来启动相机应用程序、配置相机参数并捕捉照片。我们还讨论了如何处理拍照后的照片并将其保存在设备上。
学习如何在ndroid应用程序中捕捉相机拍照的动作非常重要。希望本文能够帮助您了解如何在ndroid应用程序中捕捉相机拍照的动作,并为您的ndroid应用程序开发提供帮助。