Android Camera Surface显示相关问题总结

1.默认创建的Preview Surface填充RGBA数据显示异常。

//界面创建的Surface format默认为4(RGB_565),而预览界面所需的格式是RGBA_8888
ANativeWindow_setBuffersGeometry(window, width, height, WINDOW_FORMAT_RGBA_8888);

2.调用ANativeWindow的dequeueBuffer出错,返回值为-19(NO_INIT),错误信息为“requestBuffer: BufferQueue has no connected producer”。

//调用window请求buffer之前需要先将buffer添加到BufferQueuenCore中
native_window_api_connect(window, NATIVE_WINDOW_API_CPU)

3.执行添加/移除/添加同一Surface界面时,出现-22(BAD_VALUE),错误信息为“connect: already connected (cur=%d req=%d)”。

//移除surface时要将window对应从BufferQueuenCore中删除
native_window_api_disconnect(window, NATIVE_WINDOW_API_CPU)

4.调用ANativeWindow的dequeueBuffer出错,返回值为-11(WOULD_BLOCK),对应可能原因是暂时无法申请到slot或者freebuffer。dequeueBuffer接口和queueBuffer接口需要配套使用,dequeueBuffer申请buffer成功后,不管中间出现什么问题,都应该调用queueBuffer送还buffer,否则会出现当前线程使用占据着buffer使用权,后续线程申请buffer无法成功的情况。

ANativeWindowBuffer* buffer;
int fd;
sp window = surface;
//dequeueBuffer和queueBuffer配套使用
window->dequeueBuffer(window.get(), &buffer, &fd);
window->queueBuffer(window.get(), buffer, fd);

你可能感兴趣的:(Android随笔,android)