2012-01-09 6 views
3

タイトルにかなり問題があると思います。camera.takePicture()を複数回使用すると、最後の写真のみが保存されます

基本的には、どのようなI`mがやろうとすると、このです:

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に設定されているということです。つまり、各写真をdに保存しています。あなたはjpegCallbackでファイル名を取得するより良い方法が必要になります。

jpegCallbackの次の写真に電話をかけて、写真を同期して撮影することができます。何枚の写真があるのか​​わからない場合は、配列を作成し、ランダムな文字列を使用してjpeg写真でファイル名を作成し、後で使用するためにファイル名を配列に追加することができます。

+0

ありがとう、本当に役に立ちました:) – scana

関連する問題