2012-01-09 99 views
3

我認爲我的問題在標題中描述得相當好。只使用camera.takePicture()多次保存最後一張照片

基本上,我真的想要做的是這樣的:

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

但我的代碼只設法保存最後一個(D.JPG)。

doSomethingElse()是actualy旋轉上我的手機看臺(我想利用每面牆上的圖片在房間的平臺功能。

是否有一個簡單的方法來解決這一問題?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,然後d在jpegCallback被觸發前,這意味着您將每張照片保存爲d。您將需要一個更好的方式來獲取jpegCallback中的文件名。

您可以通過將電話放入jpegCallback中的下一張照片來同步拍攝照片,並只需要記下您的位置。如果你不知道有多少照片,你可以創建一個數組,並使用隨機字符串(我在mili中使用時間)在jpeg照片上按需創建文件名,並將該文件名添加到數組中以備後用。

+0

非常感謝,這真的很有用:) – scana 2012-01-10 11:26:12

相關問題