Camera2 Api自动闪光不起作用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Camera2 Api自动闪光不起作用相关的知识,希望对你有一定的参考价值。
我需要帮助android相机2 api自动闪光灯。此解决方案适用于一部手机但不适用于另一部手机。我花了几个小时寻找解决方案,但我没有成功。
我的takePhoto代码:
pictureTaken = false;
if (null == cameraDevice) {
Log.e(TAG, "cameraDevice is null");
return;
}
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
int width = 1024;
int height = 768;
cv.setBackground(getResources().getDrawable(R.drawable.fotak_zeleny));
ImageReader reader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1);
List<Surface> outputSurfaces = new ArrayList<Surface>(2);
outputSurfaces.add(reader.getSurface());
outputSurfaces.add(new Surface(textureView.getSurfaceTexture()));
final CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.addTarget(reader.getSurface());
captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
captureBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START);
if (flashMode == FLASH_AUTO) {
captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
} else if (flashMode == FLASH_ON) {
captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
} else if (flashMode == FLASH_OFF) {
captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
}
// Orientation
int rotation = getWindowManager().getDefaultDisplay().getRotation();
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation));
final File file = new File(fileName);
if (file.exists()) {
file.delete();
}
etc....
我的创建相机预览代码:
protected void createCameraPreview() {
try {
SurfaceTexture texture = textureView.getSurfaceTexture();
assert texture != null;
texture.setDefaultBufferSize(imageDimension.getWidth(), imageDimension.getHeight());
Surface surface = new Surface(texture);
captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, false);
captureRequestBuilder.addTarget(surface);
cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
//The camera is already closed
if (null == cameraDevice) {
return;
}
// When the session is ready, we start displaying the preview.
cameraCaptureSessions = cameraCaptureSession;
updatePreview();
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
}
}, null);
} catch (CameraAccessException e) {
e.printStackTrace();
} catch (NullPointerException ex) {
ex.printStackTrace();
}
}
这个解决方案在我的LG手机上工作正常,但阿尔卡特无法正常工作。我尝试了很多写在这里的想法,但没有成功。
可以帮帮我吗?
十分感谢
(对不起我的英语不好)
您还应该为预览请求设置所选的AE_MODE,并在用户切换闪光模式时更新它。此外,您需要在任何高于LEGACY级别的设备上运行预捕获序列。
仅针对单个静止捕获请求更改闪光模式将无法正常工作,因为手机将无法触发预闪以正确计算闪光功率。
看看camera2basic运行预捕获序列。如果可能,它总是将AE模式设置为AE_MODE_AUTO_FLASH,但相同的代码对其他闪光模式可以正常工作(尽管如果闪光灯设置为OFF,您可以跳过预捕获序列,一般情况下,只要聚焦质量正常)。
如果你点击CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH
命令,你会看到:
- 可以在预捕获序列期间闪光 (由{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger}触发)和 可能会因为捕获而被解雇 {@link CaptureRequest#CONTROL_CAPTURE_INTENT android.control.captureIntent}字段设置为STILL_CAPTURE
这意味着您必须在捕获图片之前先触发预捕获序列。
可以在这里查看Google的示例应用程序,以获取详细的实现,https://github.com/google/cameraview
我使用默认相机应用程序,因为这个相机api在不同的手机上是不同的。
以上是关于Camera2 Api自动闪光不起作用的主要内容,如果未能解决你的问题,请参考以下文章
EGL 错误:0x3003,相机设备遇到严重错误(Camera2 Api)