PictureCallback.onPictureTaken никогда не вызывается - PullRequest
12 голосов
/ 01 июня 2011

Я пишу приложение, для которого нужны снимки, сделанные камерой. Проблема возникает, когда я пытаюсь сделать реальный снимок. Вот код, который беспокоит меня:

    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);

На эмуляторе вроде бы работает но на моем телефоне (Motorola Defy - android 2.1).

Актуальная проблема: на телефоне никогда не происходит обратный вызов изображения «onPictureTaken» никогда не вызывается. Shuttercallback выполняется, а другой - нет (и я попытался использовать raw вместо jpeg, тоже самое).

Кто-нибудь знает эту проблему? Я просто не вижу, в чем разница сейчас с эмулятором. Я ценю вашу помощь.

Ответы [ 3 ]

17 голосов
/ 07 июня 2011

Я наконец пошел и отладил проблему. Внезапно это сработало, потому что отладка намного медленнее: это проблема синхронизации. Для обратного вызова требуется некоторое время. Во время отладки у телефона было достаточно времени, чтобы закончить фотографировать ...

Также не вызывайте Camera.stopPreview () и Camera.release () слишком рано.

10 голосов
/ 11 августа 2012

У меня была именно эта проблема. После долгих отладок я наконец понял, что глупый объект 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;
  }
}
0 голосов
/ 16 мая 2014

В моем случае это не был вызов изображения на определенном устройстве. Проблема была вызвана тем, что камера дважды открывалась на onResume () и oncreate ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...