3

我在某些 Android 5.0 设备上使用 Android 的 Camera2 API 使用 RenderScript 分配作为预览输出表面时遇到问题,我正在努力找出原因。

我创建输入分配如下:

Type.Builder yuvTypeBuilder = new Type.Builder(mRenderScript, Element.YUV(mRenderScript));
yuvTypeBuilder.setX(width);
yuvTypeBuilder.setY(height);
yuvTypeBuilder.setYuvFormat(ImageFormat.YUV_420_888);
mInputAllocation = Allocation.createTyped(mRenderScript, yuvTypeBuilder.create(), Allocation.USAGE_IO_INPUT | Allocation.USAGE_SCRIPT);

然后将此分配用作请求构建器和捕获会话的预览表面:

mPreviewRequestBuilder = mCamera.createCaptureRequest( CameraDevice.TEMPLATE_PREVIEW );
mPreviewRequestBuilder.addTarget( mInputAllocation.getSurface() );

List<Surface> outputSurfaces = Arrays.asList( mInputAllocation.getSurface() );
mCamera.createCaptureSession( outputSurfaces, mCallback, mHandler );

但是,每当我尝试在会话中进行捕获时,例如以下内容onConfigured

mCaptureSession.setRepeatingRequest( mPreviewRequestBuilder.build(), mCaptureCallback, mHandler );

它会引发 IllegalArgumentException 和错误日志,如下所示:

I/CameraManager(16589): Using legacy camera HAL.
...
D/Camera  (16589): app passed NULL surface
E/CameraDevice-0-LE(16589): submitRequestList - cannot use a surface that wasn't configured

这个完全相同的代码在我测试过的 6.0 设备上没有问题,如果我将预览表面更改为 ImageReader,5.0 设备也可以工作。

4

0 回答 0