2012-02-02 6 views
11

Camera.takePicture()が呼び出されると、プレビューのドキュメントの説明に従って更新が中止されます。イメージキャプチャプロセスが終了したことを検出し、startPreview()を呼び出して再度更新を開始する最も良い方法は何ですか?画像がキャプチャされた後、StartPreview()を呼び出す最も良い方法は何ですか?

takePictureに渡されたコールバックのいずれにもコールを置くことはできません。コールバックを呼び出す前にすべてが返されるはずだからです。

現在のところ、ハンドラを作成して、JPEGコールバック(または最後に返されるコールバックのうちのどれか)から遅延ランナブルを投稿することをお勧めします。

答えて

6

AsyncTask(またはスレッド)内からmCamera.takePictureを開始する必要がありますが、AsyncTaksは簡単なオプションです。 (もちろん変更することができる)

A本当に単純な実装は、全

写真を撮影するために呼び出されるメソッド

/** 
* Execute the AsyncTask that will handle the preview of the captured photo. 
*/ 
public void takePicture() { 
    TakePictureTask takePictureTask = new TakePictureTask(); 
    takePictureTask.execute(); 
} 

AsyncTaskサブクラス

/** 
* A pretty basic example of an AsyncTask that takes the photo and 
* then sleeps for a defined period of time before finishing. Upon 
* finishing, it will restart the preview - Camera.startPreview(). 
*/ 

private class TakePictureTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPostExecute(Void result) { 
     // This returns the preview back to the live camera feed 
     mCamera.startPreview(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     mCamera.takePicture(null, null, mPictureCallback); 

     // Sleep for however long, you could store this in a variable and 
     // have it updated by a menu item which the user selects. 
     try { 
      Thread.sleep(3000); // 3 second preview 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return null; 
    } 

} 

PictureCallbackフィールド

private PictureCallback mPictureCallback = new PictureCallback() { 

    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     File file = null; 

     // Check whether the media is mounted with read/write permission. 
     if (Environment.MEDIA_MOUNTED.equals(
       Environment.getExternalStorageState())) { 
      file = getOutputMediaFile(); 
     } 

     if (file == null) { 
      Log.d(TAG, "Error creating media file, check storage persmissions!"); 
      return; 
     } 

     try { 
      FileOutputStream fileOutputStream = new FileOutputStream(file); 
      fileOutputStream.write(data); 
      fileOutputStream.close(); 
     } catch (FileNotFoundException e) { 
      Log.d(TAG, "File not found: " + e.getMessage()); 
     } catch (IOException e) { 
      Log.d(TAG, "Error accessing file: " + e.getMessage()); 
     } 
    } 
}; 
+0

このチュートリアルでは間違っていますか? http://developer.android.com/training/camera/cameradirect.html私は実際にそこでプレビューを再開するのは本当に理解できませんが、AsyncTaskなどのようには見えません。 – Headcrab

12

PictureCallbackが(それがUIをロックしません)とにかく別のスレッドで開始されているので、あなたは、キャプチャを呼び出すためにAsyncTaskを使用する必要はありません。あなたがやりたいことには2つの方法があります

は、最も簡単には、以下である:

mCamera.startPreview(); //preview has to be started before you can take a picture 
mCamera.takePicture(null, null, mPictureCallback); //take a picture 

private PictureCallback mPictureCallback = new PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     camera.startPreview(); //once your camera has successfully finished 
           //its capture it's safe to restart the preview 
     ... //anything else you want to do to process that image 
    } 
} 

目は匿名関数、例えば使用して次のようになります。

mCamera.takePicture(null, null, new PictureCallback(){ 
    ... 
}); 

両方をあなたのニーズに応じて、その用途を持っています。

+0

'PictureCallback'が動作するようにするバックグラウンドスレッド、カメラは別のイベントスレッドで開く必要があります。[コード例](http://stackoverflow.com/a/19154438/192373)を参照してください。 –

+0

@Alex私の理解は、あなたのポストで参照したPictureCallback()とPreviewCallback()が異なって動作することです。あなたがPictureCallback()からの結果として得られたイメージの作業をしたいなら、そのためにスレッドを使います。 私の理解が間違っている場合はお知らせください。 – wblaschko

+0

チェックするのは簡単ですが、私は解答を知らない –

関連する問題