2013-04-26 2 views
0

Edit: я узнал, что проблема заключается в функции onPreviewFrame:Как сохранить фотографию с камеры Android

@Override 
    public void onPreviewFrame(byte[] data, Camera camera) { 
     if (frameCount == 0) { 
      start = System.currentTimeMillis(); 
     } else if (frameCount % 100 == 0) { 
      Log.e("FPS", 1000 * frameCount 
        /(System.currentTimeMillis() - start) + ""); 
     } 
     frameCount++; 
     Bitmap temp = BitmapFactory.decodeByteArray(data, 0, data.length); 
     try { 
      temp.compress(CompressFormat.JPEG, 90, new FileOutputStream(new File("/sdcard/"+frameCount+".jpg"))); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     camera.addCallbackBuffer(data); 
    } 

Если удалить весь код, связанный с Bitmap, то программа может сделать снимок без каких-либо ошибок. Как сохранить изображения в кадре и лучшее изображение с помощью Camera.takePicture? Я попытался сохранить фотографию с камеры, когда нажата кнопка, и запустите другую операцию, чтобы отредактировать фотографию.

mTakePic.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        mTakePic.setImageDrawable(takePicDown); 
        mCamera.takePicture(new ShutterCallback() { 

         @Override 
         public void onShutter() { 
          // TODO Auto-generated method stub 

         } 
        }, null, new PictureCallback() { 


         @Override 
         public void onPictureTaken(byte[] yuv, Camera camera) { 
          Intent editImage = new Intent(getApplicationContext(), EditActivity.class); 

          if(savePhoto != null) { 
           try { 
            savePhoto.get(); 
           } catch (InterruptedException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
           } catch (ExecutionException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
           } 
          } 
          savePhoto = new SavePhotoTask(); 
          savePhoto.execute(yuv); 

//       releaseCamera(); 
          startActivity(editImage); 
         } 
        }); 
       } else if (event.getAction() == MotionEvent.ACTION_UP) { 
        mTakePic.setImageDrawable(takePicUp); 
       } 
       return true; 
      } 
     }); 

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

ответ

1

Редактировать: К сожалению, я принял на себя вопрос, я думал, что вы связываете крах, который вы упомянули в SavePhotoTask. Вот как вы можете сохранить фотографию с вашего PictureCallback

Первый аргумент onPictureTaken - это массив байтов, содержащий изображение. Просто записать его в файл - это лучший способ сохранить изображение. Что-то вроде этого ...

FileOutputStream out = new FileOutputStream("path/to/image"); 
out.write(data, 0, data.length); 
out.close(); 

Где «данные» является первым агд из onPictureTaken. Эта же техника должна работать, чтобы сохранить каждый кадр в onPreviewFrame, но я никогда не пробовал это, поэтому я не могу быть уверен. Похоже, у вас есть идея поместить эту операцию в отдельный поток, что отлично, и я продолжу изучение этого параметра. Однако я бы не использовал Bitmap, поскольку это потребует времени и ресурсов и может привести к ошибкам OOM, если вы одновременно конвертируете много кадров и имеете все эти растровые изображения в памяти.


После того, как вы сделаете вызов Camera.open(), ваше приложение ставит блокировку камеры и блокировки любых других приложений (включая последующие экземпляры вашего собственного приложения) от его использования. Вызов должен быть сделан до Camera.release(), когда ваше приложение будет выполнено, или камера останется заблокированной до тех пор, пока, как вы уже отметили, телефон перезагружен. The dev docs for the Camera has a good checklist to follow at the top in order to ensure the class gets used correctly.

я имел успех делает вызов Camera.open() в onResume() и Camera.release() в onPause(). Чтобы все было в порядке и без ошибок, вам может понадобиться управлять стартом и останавливать просмотр в этих точках.

+0

Спасибо @MattDavis, но это не ответ на мой вопрос. Я отредактировал вопрос, пожалуйста, взгляните на него –

+0

Я отредактировал свой ответ, чтобы показать, как сохранить, сообщите мне, если это поможет. – MattDavis

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