2012-01-09 2 views
3

제목에 내 문제가 잘 설명되어 있다고 생각합니다.camera.takePicture()를 여러 번 사용하면 마지막 사진 만 저장됩니다.

takeFocusedPhoto("a"); 
doSomethingElse(); 
takeFocusedPhoto("b"); 
doSomethingElse(); 
takeFocusedPhoto("c"); 
doSomethingElse(); 
takeFocusedPhoto("d"); 

하지만 내 코드는 마지막 (d.jpg)를 저장 관리 : 기본적으로

, 무엇을 난`이 일을하려고하는 것은 이것이다.

doSomethingElse는() actualy 내 휴대 전화 스탠드 (I 방에있는 모든 벽의 사진을 촬영하고자하는 플랫폼을 회전하는 기능입니다.

은? I`d가 감사를이 문제를 해결하는 쉬운 방법이 있나요 도움이나 제안의 모든 종류의

코드 :.

/** Takes photo with default settings */ 
public void takePhoto(){ 

    camera.startPreview(); 

    camera.takePicture(null, rawCallback, jpegCallback); 

    camera.stopPreview(); 

} 
/** Takes photo using Auto Focus function */ 
public void takeFocusedPhoto(String name){ 

    filename=name; 
    isAutoFocused=false; 
    camera.startPreview(); 

     AutoFocusClbk afcb = new AutoFocusClbk(); 
     camera.autoFocus(afcb); 

     if(isAutoFocused){ 
      Log.d(TAG, "takeFocusedPhoto - AutoFocused"); 
     } 
     else{ 

      Log.d(TAG, "takeFocusedPhoto - NOT AutoFocused"); 

     } 

     camera.takePicture(null, rawCallback, jpegCallback); 


    camera.stopPreview(); 

} 
/** Releases the interface */ 
public void closeCamera(){ 

    camera.release(); 

} 
/** Shutter */ 
/*ShutterCallback shutterCallback = new ShutterCallback() { 
    public void onShutter() { 
     Log.d(TAG, "onShutter'd"); 
    } 
};*/ 

/** Handles data for raw picture */ 
PictureCallback rawCallback = new PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 
     Log.d(TAG, "onPictureTaken - RAW"); 
    } 
}; 
/** Handles data for jpeg picture */ 
PictureCallback jpegCallback = new PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 
     FileOutputStream outStream = null; 
     try { 
      //write the file to sdcard 
      outStream = new FileOutputStream(String.format("/sdcard/"+filename+".jpg"));  
      outStream.write(data); 
      outStream.close(); 
      Log.d(TAG, "onPictureTaken - SUCCESS! - wrote bytes: " + data.length); 
     } catch (FileNotFoundException e) { 
      Log.d(TAG, "onPictureTaken - FAILURE - FileNotFound"); 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
     } 
     Log.d(TAG, "onPictureTaken - JPEG"); 
    } 
}; 
/** AutoFocus Callback */ 
private class AutoFocusClbk implements Camera.AutoFocusCallback{ 

    public void onAutoFocus(boolean success, Camera camera){ 

     isAutoFocused = success; 
     Log.d(TAG, "onAutoFocus - AutoFocused: "+success); 
    } 

}; 
} 

답변

2

takePicture에 대한 호출을 사용하면 사진 데이터가 준비되면, 발사되는 콜백, 전달하는 이유 즉, 비동기 때를. takeFocusedPhoto()를 연속적으로 호출하십시오. 모두가 ge입니다. 처음 촬영까지도 해고 된 사진입니다. takeFocusedPhoto 메서드 본문을 보면 클래스 멤버 변수 filename을 name 인수와 같게 설정합니다. 이것이 의미하는 바는 filename이 a, b, c로 설정된 다음 j가 jpegCallback이 시작되기 전에 d로 설정된다는 것입니다. 이는 각 사진을 d에 저장하고 있음을 의미합니다. jpegCallback에서 파일 이름을 얻는 더 좋은 방법이 필요합니다.

jpegCallback에서 다음 사진으로 전화를 걸면 동 기적으로 사진을 찍을 수 있으며 현재 위치를 계속 카운트 할 수 있습니다. 얼마나 많은 사진을 가지고 있는지 알지 못한다면 배열을 만들고 jpeg 사진에서 임의의 문자열 (mili로 시간 사용)을 사용하여 필요에 따라 파일 이름을 만들고 나중에 사용할 수 있도록 파일 이름을 배열에 추가 할 수 있습니다.

+0

고맙습니다. 정말 도움이되었습니다. :) – scana

관련 문제