【问题标题】:Android: Camera.takePicture callbacks don't always triggerAndroid:Camera.takePicture 回调并不总是触发
【发布时间】:2023-03-27 18:10:01
【问题描述】:

大概有 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);      
  }
};

【问题讨论】:

    标签: android camera photo image


    【解决方案1】:

    您能否调试并检查它是否在任何函数 rawCallback 或 jpegCallback 中运行。您是否正在为您的相机设置 jpeg 格式。我想根据那个回调函数会被调用。所以它应该在 rawCallback 或 jpegCallback 中。你可以试一次吗?

    mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);

    如果它失败了,那么它要去的地方可能是你再次打开相机的地方。在这种情况下,我认为您的相机参数将被重置并可能返回原始回调而不是 jpeg

    实际上,我认为如果相机没有崩溃并且它不为空,那么唯一的情况就是您正在使用默认设置重置相机或者您再次打开相机..

    【讨论】:

    • 我最初一直在做建议。我只是将 raw 设置为 null,因为它是不需要的,并且会进行额外的回调。它设置回调又名 mCamera 不为空,但它很少触发回调。
    • 这就是我希望你检查一次,如果它失败了,那么它的去向可能是你再次打开相机的地方。在这种情况下,我认为您的相机参数将被重置,并可能返回原始回调而不是 jpeg。
    • 拍摄图像后,它会关闭活动。重新拍摄照片的唯一方法是重新加载活动,从而再次对其进行初始化。除非它在回调完成之前关闭活动(并处置相机)?
    • 似乎是问题所在。在 photo -> this.finish 调用 onPause() 之后,释放相机。因此,回调丢失了他们的相机对象。我会暂时看看情况如何,如果问题确实消失了,请标记为正确。
    • 实际上我认为如果相机没有崩溃并且它不为空,那么这是唯一的情况......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多