Android:相机拍照回调不总是触发

3

可能有90%的情况下,回调函数无法触发。

因此我的图片从未被保存。

我做错了什么?

   @Override
public boolean onTouchEvent(MotionEvent event)
{
    boolean result = super.onTouchEvent(event);

       int action = event.getAction();
       if(action == MotionEvent.ACTION_DOWN)
       {
           takePicture();

           this.finish(); // ERROR IS HERE. Closing down before callback is done.

       }    
       return result;
}

private void takePicture() {
    if (mCamera != null)
        mCamera.takePicture(shutterCallback, null, jpegCallback);     
}

ShutterCallback shutterCallback = new ShutterCallback() {
      public void onShutter() {

          AudioManager meng = (AudioManager) getBaseContext().getSystemService(Context.AUDIO_SERVICE);
            int volume = meng.getStreamVolume( AudioManager.STREAM_NOTIFICATION);

            if (volume != 0)
            {
                    MediaPlayer _shootMP = MediaPlayer.create(getBaseContext(), Uri.parse("file:///system/media/audio/ui/camera_click.ogg"));
                    _shootMP.start();
            }
      Toast.makeText(CameraActivity.this, "Picture Taken", Toast.LENGTH_SHORT).show();
      }
};

PictureCallback rawCallback = new PictureCallback() {
      public void onPictureTaken(byte[] _data, Camera _camera) {
        // TODO Do something with the image RAW data.
          int test = 1;
      }
};

PictureCallback jpegCallback = new PictureCallback() {
  public void onPictureTaken(byte[] _data, Camera _camera) {
      File photo=new File(Environment.getExternalStorageDirectory(), "photo1.jpg");

      if (photo.exists()) {
            photo.delete();
      }

      try {
        FileOutputStream fos=new FileOutputStream(photo.getPath());

        fos.write(_data);
        fos.close();
      }
      catch (java.io.IOException e) {
        Log.e("PictureDemo", "Exception in photoCallback", e);
      }



      SqlDB.SavePhoto(1, _data);      
  }
};
1个回答

2

你能否调试并检查是否进入了rawCallback或jpegCallback函数中的任何一个。你是否为相机设置了JPEG格式。根据回调函数,应该会被调用。因此,它应该进入rawCallback或jpegCallback之一。你可以试试看。

mCamera.takePicture(shutterCallback, rawCallback , jpegCallback);

如果失败了,那么它可能会去到某个地方重新打开相机。在这种情况下,我认为相机参数将被重置,并可能返回raw回调而不是jpeg。

实际上,我认为如果相机没有崩溃且不为空,唯一剩下的情况就是您正在使用默认设置重置您的相机,或者您正在重新打开相机。


我最初一直在按照建议进行操作。我只是将原始值设置为null,因为这不是所需的并且会产生额外的回调。它设置回调,即mCamera不为null,但很少触发回调。 - IAmGroot
这是我想让你检查一下的内容,如果它失败了,那么可能会去某个地方重新打开相机。在这种情况下,我认为您的相机参数将被重置,并可能返回原始回调而不是JPEG。 - Bharat Sharma
一旦拍摄完成,它就会关闭该活动。重新拍照的唯一方法是重新加载该活动,因此需要再次初始化。除非在回调完成之前关闭该活动(并处理相机)? - IAmGroot
似乎是这个问题。在拍照后,调用this.finish来释放相机并触发onPause()。因此,回调函数失去了它们的相机对象。我会暂时观察一下情况,如果问题确实解决了,我会标记为正确的。 - IAmGroot
其实我认为,如果相机没有崩溃并且它不为空,那么这就是唯一剩下的情况了。 - Bharat Sharma
如果您修改您的答案以包含已注释的解决方案,我可以接受它。谢谢。 - IAmGroot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接