2012-09-18 2 views
0

카메라 기능을 기반으로 안드로이드 응용 프로그램을 개발하고 있습니다. 나는 그것을 이해할 수없는 나의 프로그램에서 약간의 문제를 가지고있다. 내 mCurrentImagePath은 초기화 될 때마다 항상 null입니다. logcat은 결코 takepicture() 함수에 도달하지 않는다는 것을 보여주기 때문에 절대 값이 주어지지 않습니다. 스레드가 잠자기 상태가되어 비트 맵에 대한 이후 작업이 카메라가 그림을 잘 저장할 때까지 기다릴 수는 있지만 여전히 작동하지 않습니다. 그러나 내가 찍은 사진을 읽지 않으면 응용 프로그램이 완벽하게 작동하여 사진을 잘 저장할 수 있습니다. 또한 bitmapfactory.decodebyte()을 사용하여 메타 데이터를 직접 조작하려고 시도했지만 실패했습니다. 누구나 내가 잘못한 부분을 알 수 있습니까? 정말 도움이 될 것입니다. 대단히 감사합니다 !!!안드로이드 카메라 저장 파일 오류

private static final String IMAGE_DIRECTORY ="sdcard/DCIM/Camera"; 
public static String mCurrentImagePath = null; 
private CameraView cv; 
private Camera mCamera = null; 

public Camera.PictureCallback pictureCallback = new Camera.PictureCallback() { 

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

     try{ 
      isFinish = false; 
      long timeTaken = System.currentTimeMillis(); 
      mCurrentImagePath = IMAGE_DIRECTORY + "/"+ createName(timeTaken) + ".jpg"; 
      File file = new File(mCurrentImagePath); 
      Log.d("path", "mCurrentImagePath_takepicture = " + mCurrentImagePath); 
      FileOutputStream fos = new FileOutputStream(file); 
      fos.write(data); 
      fos.flush(); 
      fos.close(); 
      Toast.makeText(OpenASURF.this, "saving the picture", Toast.LENGTH_SHORT).show(); 
      isFinish = true; 
     } 
     catch(IOException e) { 
      e.printStackTrace(); 
     } 
     mCamera.startPreview(); 
     // TODO Auto-generated method stub 
    } 
}; 

cv.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     if(mCamera != null) { 
      mCamera.takePicture(null, null, pictureCallback); 
      // let the system wait until finish taking the pictures. 
      //while(isFinish == false) { 
      try { 
       Thread.sleep(20000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      //} 
      Log.d("path", "mCurrentImagePath_over1 = " + mCurrentImagePath); 
      Bitmap bmp = null; 

      bmp = BitmapFactory.decodeFile(mCurrentImagePath); 
      Log.d("path", "mCurrentImagePath_over2 = " + mCurrentImagePath); 
     } 

답변

1

이 아무리 당신이 takePicture()onPictureTaken() 콜백 만 OnClick()의 복귀 후 호출되는 대기 시간 : 그들은 모두가 사용하지를 app 메인 스레드.

당신은 당신의 onPictureTaken()

BitmapFactory.decodeFile(mCurrentImagePath); 

를 호출 할 수 있습니다, 또는 당신은 당신의 활동에 onPictureTaken()에서 이벤트를 게시 할 수 있습니다.

+0

조언 해 주셔서 감사합니다.이 문제에 대한 내 마음이 정말 밝았습니다. onPictureTaken()에 계산 부분을 추가하려고 시도했지만 OutofMemoryError도 표시됩니다. 그것에 대해 알고 있습니까? – Zhuorui

+0

어떤 계산이 있습니까? –

+0

이미지 인식을 위해 카메라에서 가져온 사진을 사용합니다. 나는 더 일치시키기 위해 SURF 서술자를 계산할 것이다. – Zhuorui

1

IMAGE_DIRECTORY이 맞습니까? 나는 그것을 /sdcard/DCIM/Camera, 앞으로 슬래시를 여는 것으로 기대하고 싶습니다.

더 나은

아직 이미지 경로를 올바른 방법으로 얻을 것 : DIRECTORY_PICTURES

File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
File file = new File(path, "DemoPicture.jpg"); 
관련 문제