PictureCallback.onPictureTaken从未调用过

Yas*_*ima 12 camera android

我正在编写一个需要用相机拍摄的照片的应用程序.当我尝试拍摄实际照片时会出现问题.这是困扰我的代码:

    final ShutterCallback shutterCallback = new ShutterCallback() {
        @Override
        public void onShutter() {
            Log.d(TAG, "onShutter");
        }
    };

    final PictureCallback callback = new PictureCallback() {

        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            Log.d(TAG, "onPictureTaken - jpeg");
            try {
                //async task for storing the photo
                new SavePhotoTask(CameraView.this.ctx, data).execute();
            } catch (final SavePhotoException e) {
                //some exceptionhandling
            }
        }
    };
    this.camera = Camera.open();
    this.camera.setPreviewDisplay(surfaceHolder);
    final Camera.Parameters parameters = findBestParameters(w, h);
    this.camera.setParameters(parameters);
    this.camera.startPreview();
    Log.d(TAG, "takePicture now!");
    this.camera.takePicture(shutterCallback, null, callback);
Run Code Online (Sandbox Code Playgroud)

在模拟器上它似乎工作但在我的手机上(摩托罗拉Defy - 安卓2.1).

实际问题:在手机上,picturecallback永远不会发生"onPictureTaken"永远不会被调用.Shuttercallback被执行但是另一个没有(我尝试使用raw而不是jpeg,同样的事情).

有谁知道这个问题?我现在还没有看到模拟器的不同之处.我感谢您的帮助.

Yas*_*ima 17

我终于去调试了这个问题.突然间它起作用,因为调试速度慢得多:这是一个时间问题.回调需要一些时间来调用.调试手机时有足够的时间完成拍照...

也不要太早调用Camera.stopPreview()和Camera.release().


小智 10

我遇到了这个问题.经过多次调试后,我终于意识到愚蠢的Camera对象在有机会调用回调之前就收集了垃圾!

我通过创建我正在使用的Camera对象的硬引用来修复它.我使它成为我的PictureTaker类的成员,在调用takePicture()之前设置它,然后在我收到数据后在jpeg回调中将其清空.然后我只需要确保我的PictureTaker对象本身不会获得gc'd,这是通过在进程的生命周期中将它保存在我的Application子类中来实现的.

这总是适用于我的Droid RAZR:

public class PictureTaker implements Camera.PictureCallback
{
  private Camera mCam;
  private MyApp theApp;

  public PictureTaker(MyApp app)
  {
     theApp = app;
  }

  public void takePicture()
  {
     try
     {
        mCam = Camera.open();
     }
     catch (Exception e)
     {
        System.out.println("Problem opening camera! " + e);
        return;
     }

     if (mCam == null)
     {
        System.out.println("Camera is null!");
        return;
     }

     try
     {
        SurfaceView view = MyApp.getPreviewSurface(); // my own fcn
        mCam.setPreviewDisplay(view.getHolder());
        mCam.startPreview();
        mCam.takePicture(null, null, this);
     }
     catch (Exception e)
     {
        System.out.println("Problem taking picture: " + e);
     }
  }

  public void onPictureTaken(byte[] data, Camera cam)
  {
     theApp.jpegPictureData(data);  // also my own fcn

     cam.stopPreview();
     cam.release();

     mCam = null;
  }
}
Run Code Online (Sandbox Code Playgroud)