You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CameraX自定义Surface渲染预览无回调且无法正常工作的问题求助

CameraX自定义Surface渲染预览无回调且无法正常工作的问题求助

问题描述

我在Android中使用CameraX组件,根据官方文档可以通过Preview.setSurfaceProvider()设置渲染界面,但我不想使用PreviewView组件,而是想把相机预览渲染到自己自定义的Surface上。试了很多方法都没成功,希望大家能帮忙,谢谢!

自定义Surface的实现(Activity代码)

我通过GL纹理创建了自定义的Surface,具体代码如下:

Surface mPreviewSurfaces;
private int textureIds = 0;

public boolean InitTexture()
{
    // 通过GL创建OES纹理ID
    int videoTextureId = FBOUtils.createOESTextureID();
    textureIds = videoTextureId;
    if (mSurfaceTexture != null) {
        mSurfaceTexture.release();
    }

    mSurfaceTexture = new SurfaceTexture(textureIds);
    TextureListenser listenser = new TextureListenser();
    mSurfaceTexture.setDefaultBufferSize(1280, 720);
    mSurfaceTexture.setOnFrameAvailableListener(null);
    mSurfaceTexture.setOnFrameAvailableListener(listenser);
    mPreviewSurfaces = new Surface(mSurfaceTexture);
    return true;
}

CameraX的配置与启动(Service代码)

我创建了一个Service来配置并启动CameraX,首先构建Preview实例:

Preview.Builder builder = new Preview.Builder();
builder.setTargetRotation(Surface.ROTATION_90);
builder.setResolutionSelector(resolutionSelector);
_PreviewUseCase = builder.build();

接着为Preview设置自定义的SurfaceProvider:

Surface mSurface = CameraXApp.get_Surface();

_PreviewUseCase.setSurfaceProvider(request -> {
            Size resolution = request.getResolution();
            Log.d("Camera", "Requested resolution: " + resolution.getWidth() + "x" + resolution.getHeight());

            if (mSurface != null && mSurface.isValid()) {
                Log.d("Camera", "surface.....");
            }

            assert mSurface != null;
            request.provideSurface(
                    mSurface,
                    ContextCompat.getMainExecutor(mActivity),
                    result -> { 
                        Log.d(TAG, "surface complete");
                    }
            );
});

_CameraProvider.bindToLifecycle(/* lifecycleOwner= */ (LifecycleOwner)mActivity, _CurrentCameraSelector, _PreviewUseCase);

当前遇到的问题

程序能够正常运行,日志中可以看到Requested resolution和surface.....的输出,但surface complete的日志完全没有打印,也无法通过result获取到回调结果。之前使用_PreviewUseCase.setSurfaceProvider(R.id.PreviewView)时,预览是可以正常显示的,实在找不到问题所在,希望大家能给我一些排查方向或提示!

备注:内容来源于stack exchange,提问作者duan danny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 10:59:29