2014-09-15 2 views
1

После выполнения шагов, указанных в документации API Android, я не получаю никаких обратных вызовов после вызова Camera.takePicture() (без обратного вызова затвора или обратного вызова изображения). У меня есть правильные разрешения, объявленные в манифесте, я не получаю никаких исключений, и я могу использовать этот код для записи видео. Аналогичные вопросы по этому вопросу касались только не вызываемого Camera.PictureCallback, но я не нашел никаких вопросов, по которым Camera.ShutterCallback не вызывается. Вот мой код:Никаких обратных вызовов после Camera.takePicture()

private class CameraPreview extends SurfaceView implements SurfaceHolder.Callback, 
      Camera.PictureCallback, Camera.ShutterCallback { 

     protected SurfaceHolder mHolder; 

     @SuppressWarnings("deprecation") 
     public CameraPreview() { 
      super(VideoActivity.this); 
      mHolder = getHolder(); 
      mHolder.addCallback(this); 
      // Deprecated setting is required for API < 11 
      // Automatically set for API >= 11, no issue with continuing to use it 
      mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     } 

     @Override 
     public void surfaceCreated(SurfaceHolder holder) { 
      Log.d(TAG, "Surface is created"); 
      try { 
       mCamera = getCamera(); 
       Log.d(TAG, "Camera created when surface was created"); 
       if(mCamera != null) { 
        mCamera.lock(); 
        Camera.Parameters parameters = mCamera.getParameters(); 
        parameters.setPictureFormat(ImageFormat.JPEG); 
        mCamera.setParameters(parameters); 
        mCamera.setPreviewDisplay(mHolder); 
        mCamera.startPreview(); 
        Log.d(TAG, "Preview Started"); 
       } 
      } catch(IOException e) { 
       Log.e(TAG, "IOException in setting camera preview: " + e.getMessage(), e); 
      } 
     } 

     @Override 
     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } 

     @Override 
     public void surfaceDestroyed(SurfaceHolder holder) { } 

     @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 

      Log.d(TAG, "onPictureTaken called"); 
      File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); 
      if(pictureFile == null) { 
       Log.e(TAG, "Error creating media file"); 
       return; 
      } 
      Log.d(TAG, "Writing to file: " + pictureFile); 

      try { 
       FileOutputStream fos = new FileOutputStream(pictureFile); 
       fos.write(data); 
       fos.close(); 
      } catch (FileNotFoundException e) { 
       Log.e(TAG, "File not found: " + e.getMessage()); 
      } catch (IOException e) { 
       Log.e(TAG, "Error accessing file: " + e.getMessage()); 
      } 

    } 

    @Override 
    public void onShutter() { 
     Log.d(TAG, "onShuttter is called"); 
    } 
} 

Экземпляр этого класса инициализируется в OnStart() и хранится в переменной экземпляра под названием mPreview. mPreview реализует интерфейсы обратного вызова камеры, поэтому я могу использовать их таким образом. Класс CameraPreview работает для записи видео. Логика при фотосъемке:

mCamera.lock(); 
mCamera.takePicture(mPreview, null, mPreview); 
Toast.makeText(VideoActivity.this, "Picture Taken", 
     Toast.LENGTH_SHORT).show(); 
Log.d(TAG, "Picture Taken"); 

Так что мой вопрос, почему я не получаю никаких обратных вызовов?

ответ

0

Я понял вопрос некоторое время назад и забыл поделиться, так вот она:

мне нужно позвонить mCamera.reconnect() после mCamera.startPreview() и перед mCamera.takePicture(). Я считаю, что это связано с тем, что я получал обратные вызовы из другого процесса, чтобы сделать снимок, и повторное соединение нужно вызвать после того, как камера используется другим процессом.

Смежные вопросы