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

Android Camera onPictureTaken回调未触发问题求助

Android Camera API 19: onPictureTaken 回调不触发问题

这是Stack Overflow上十分常见的问题,已有不少相关解答,但这些方案对我及许多其他开发者均无效,比如讨论Android Camera API 19中onPictureTaken不被调用的相关帖子。

我查阅了大量同类问题,但始终未找到可行的修复方案。我按照Android官方文档的代码搭建了相机功能,但调用takePicture()后,onPictureTaken()回调从未被执行。经调试发现,应用在调用takePicture()后会直接结束onClick交互流程,回调完全不触发。若无法找到解决方案或不愿查看我的代码,恳请提供一个可运行的示例。

以下是我的精简代码:

public final class MainActivity extends AppCompatActivity
implements SurfaceHolder.Callback, PictureCallback {


    private ImageView imageView;
    private SurfaceView surfaceView;
    private SurfaceHolder surfaceHolder;
    private Camera mCamera;
    private Parameters parameters;

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        Log.d(TAG, "Picture taken");
    }



    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        //some preparation stuff here e.g. Permissions

        mCamera = getCameraInstance();

        imageView = (ImageView) findViewById(R.id.imageView);
        surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        Button button = findViewById(R.id.button_id);
        button.setOnClickListener(it -> {
                if (mCamera != null) {
                    mCamera.takePicture(null, null, this);
                }
        });
    }

    private Camera getCameraInstance() {
        Camera cam = null;
        try {
            cam = Camera.open();
        } catch (Exception e) {
            Log.d(TAG, "getCameraInstance() - Camera is not available");
            return null;
        }

        return cam;
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();

        } catch (IOException e) {
            mCamera.release();
            mCamera = null;
        }
    }


    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
        Log.d(TAG, "surfaceChanged()");
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }
}

我已尝试以下方案:

  • 让Activity休眠以确保Surface加载完成
  • 跟踪onPause()和onResume()方法,二者均未被调用
  • 内联PictureCallback
  • 将takePicture()方法post到SurfaceView

内容的提问来源于stack exchange,提问作者Aikidoo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:56:01