2014-06-10 6 views
3

Так что я пытаюсь делать несколько снимков с регулярными интервалами времени, однако я получаю "takePicture Failed" Exceptionпосле того, как первое изображение будет просмотрено на поверхности.Съемка с регулярными интервалами (Android Camera API)

Вот мой takePictures() метод, который вызывается при нажатии кнопки:

public void takePictures() { 
     if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) { 
      camera = Camera.open(); 

      if (camera != null) { 
       try { 
        camera.setPreviewDisplay(surfaceView.getHolder()); 
        camera.startPreview(); 

        camera.takePicture(null, null, new CustomPictureCallbcak(this, cacheDir, imageView, 3, 5000)); 
       } 
       catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
     else { 
      Toast.makeText(this, "No camera found.", Toast.LENGTH_SHORT).show(); 
     } 
    } 

И вот onPictureTaken() метод CustomPictureCallback:

@Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     //get date info for file name 
     SimpleDateFormat sdf = new SimpleDateFormat("ddmmyyyyhhmmss"); 
     String date = sdf.format(new Date()); 
     String fileDir = createImageFileName(date); 

     //write the image to cache 
     writeImageToCache(fileDir, data); 

     //display file name in a toast notification 
     Toast.makeText(c, fileDir, Toast.LENGTH_SHORT).show(); 

     //show picture on imageview 
     imageView.setImageBitmap(BitmapFactory.decodeByteArray(data, 0, data.length)); 

     //retake images 
     this.camera = camera; 
     while (numOfImagesAlreadyTaken <= numOfImages) { 
      Thread thread = new Thread() { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 
        super.run(); 
        try { 
         numOfImagesAlreadyTaken++; 
         CustomPictureCallbcak.this.camera.stopPreview(); 
         sleep(delay); 
         CustomPictureCallbcak.this.camera.takePicture(null, null, CustomPictureCallbcak.this); 
        } 
        catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      }; 

      thread.start(); 
     } 

      Toast.makeText(c, "Total images taken: " + numOfImagesAlreadyTaken, Toast.LENGTH_SHORT).show(); 

      //release camera 
      camera.release(); 
      camera = null; 

    } 
+0

Где у вас возникает исключение? –

+0

@AleksanderLidtke, сразу после первого снимка, поэтому в основном при запуске нового потока. –

+1

Правильно, почему вы создаете поток, который снимает внутри «OnPictureTaken»? Не было бы проще и чище создавать «поток» и помещать цикл while в 'takePictures' и оставить метод обратного вызова относительно простым? Я написал код, который делает именно то, что вы пытаетесь сделать так, и это отлично работает с git-go. –

ответ

3

Как полагает Александр Lidtke, я создал один поток внутри моего метода takePictures() и поместить внутри него петлю while:

public void takePictures(final int numOfPictures, final int delay) { 

    if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) { 

     Thread thread = new Thread() { 
      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       super.run(); 
       while (numOfPicturesAlreadyTaken <= numOfPictures) { 
        try { 
         camera = Camera.open(); 
         camera.setPreviewDisplay(surfaceView.getHolder()); 
         camera.startPreview(); 
         camera.takePicture(null, null, new CustomPictureCallbcak(MainActivity.this, cacheDir, imageView)); 
         numOfPicturesAlreadyTaken++; 
         sleep(delay); 
        } 
        catch (Exception e) { 
         e.printStackTrace(); 
         Log.d("TEST", e.getMessage()); 
        } 
       } 
      } 
     }; 
     thread.start(); 
    } 
    else { 
     Toast.makeText(this, "No camera found.", Toast.LENGTH_SHORT).show(); 
    } 
} 
Смежные вопросы