2015-04-15 4 views
-1

Сначала, пожалуйста, извините мой плохой английский. У меня проблема с программным фотографированием. Я написал приложение, которое делает сбор фотографий на основе countdown timer, после чего фотографии обрабатываются с использованием кода C++.Метод Camera.takePicture() аварии на Nexus 5, но Xperia mini в порядке

Я использую dummy SurfaceView, потому что мне не нужен предварительный просмотр в пользовательском интерфейсе. Следующий код работает на моем телефоне Xperia mini - API 15 (так что разрешения и код будут верными), но я позаимствовал School Nexus 5 - API 21 и есть проблема с предварительным просмотром.

takePicture: camera 0: Cannot take picture without preview enabled 

Я нашел solution, который использует setPreviewTexture (комментируемое ниже) вместо setPreviewDisplay. Он работает для первой фотографии, которая обычно сохраняется, но я получаю ту же ошибку после второго вызова takePicture().

Спасибо за каждый совет, LS

Camera camera; 
@Override 
protected void onResume() { 
    super.onResume(); 
    // is camera on device? 
    if(!checkCameraHardware()) return; 

    releaseCamera(); 
    try { 
     camera.stopPreview(); 
    } catch (Exception e){ 
     Log.d(TAG, "No preview before."); 
    } 

    SurfaceView dummy = new SurfaceView(this); 
    camera = Camera.open(); 
    Camera.Parameters params = camera.getParameters(); 
    params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); 
    camera.setParameters(params); 

    try { 
     //camera.setPreviewTexture(new SurfaceTexture(10)); 
     camera.setPreviewDisplay(dummy.getHolder()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    camera.startPreview(); 
} 

РЕШЕНИЕ:

мне нужно обновить предварительный просмотр. Код ниже работает и на Xperie и Nexus. Вопрос остается, почему я должен использовать setPreviewTexture, потому что setPreviewDisplay всегда возвращает ошибку на Nexus.

camera.takePicture(null, null, new PictureCallback() { 
     @Override 
     public void onPictureTaken(final byte[] data, Camera camera) { 
      // save picture 
      refreshPreview(); 
     } 
    }); 

public void refreshPreview() { 
    try { 
     camera.stopPreview(); 
    } catch (Exception e) {} 

    try { 
     camera.startPreview(); 
    } catch (Exception e) {} 
} 

и функции onResume()

try { 
    camera.setPreviewTexture(new SurfaceTexture(10)); 
} catch (IOException e) {} 
+0

Вам не нужен SurfaceView. См. Http://stackoverflow.com/questions/22462360/android-use-camera-without-surfaceview-or-textureview/ – fadden

ответ

0

После того, как изображение будет принято, обновите вы SurfaceView & остановить просмотр и камеру и лицо, в пользу которого имеет место отказ от прав снова перезапустить процесс.

 try { 
       camera.takePicture(null, null, new PictureCallback() { 
      public void onPictureTaken(final byte[] data, Camera camera) { 
       //once ur logic done 
       refreshCamera(); 
      } 
     }); 
      } catch (Exception e2) { 
       // Toast.makeText(getApplicationContext(), "Picture not taken", Toast.LENGTH_SHORT).show(); 
       e2.printStackTrace(); 
      } 

     public void refreshCamera() { 
      if (dummy.getHolder().getSurface() == null) { 
       return; 
      } 

      try { 
       camera.stopPreview(); 
      } catch (Exception e) { 
       // ignore: tried to stop a non-existent preview 
      } 

      try { 
       camera.setPreviewDisplay(dummy.getHolder()); 
       camera.startPreview(); 
      } catch (Exception e) { 

      } 
     } 

Надеюсь, что это решение может вам помочь.

1

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

  camera.startPreview(); 
      camera.setOneShotPreviewCallback(new Camera.PreviewCallback() { 
       @Override 
       public void onPreviewFrame(byte[] data, Camera camera) { 
        camera.takePicture(null, null, new Camera.PictureCallback() { 
         @Override 
         public void onPictureTaken(byte[] data, Camera camera) { 
        // do something you want with your picture and stop preview 
          camera.stopPreview(); 
         } 
        });