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
相关产品推荐
相关产品推荐

