3連写するカメラアプリを作ろうとしています。
「takePicture」をループに入れて何度か呼び出そうとしました。
しかし、成功しません。
この問題について助けてください。
少し助けていただければ幸いです。
3連写するカメラアプリを作ろうとしています。
「takePicture」をループに入れて何度か呼び出そうとしました。
しかし、成功しません。
この問題について助けてください。
少し助けていただければ幸いです。
PictureCallback.onPictureTaken()
コードから呼び出してはいけません。このコールバックは、システムの準備ができたときに、 への応答としてシステムからデータを受け取りますCamera.takePicture()
。
後者の呼び出しは、カメラが開かれ、プレビューが開始された場合にのみ成功します。したがって、単にCamera.takePicture()
ループ内で呼び出すだけでは機能しません (例: Android 2.3.1 Camera takePicture() Multiple images with one button click を参照)。これを処理する正しい方法は、 で処理されたショットのカウンターを保持し、onPictureTaken()
それが 3 未満の場合は、カメラのプレビューを再開して (同期して) 別の を発行することCamera.takePicture()
です。この後、次のキャプチャされたフレームの処理を許可するonPictureTaken()
必要があります。return
PhotoBurstを行うときは、このように使用します。また、PhotoBurst を開始するためのプレビューを保持している FRameLayout も処理しています。
PictureCallback jpegCallback = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
FileOutputStream outStream = null;
try {
Parameters param = camera.getParameters();
param.setPictureSize(640, 480);
camera.setParameters(param);
// Or write to sdcard
outStream = new FileOutputStream(String.format(
Environment.getExternalStorageDirectory().getPath()+"/foto%d.jpg",
System.currentTimeMillis()));
outStream.write(data);
outStream.close();
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.fromFile(Environment.getExternalStorageDirectory())));
Log.i(TAG, "onPictureTaken - wrote bytes: " + data.length);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
Log.d(TAG, "onPictureTaken - jpg");
try {
stillCount++;
camera.startPreview();
if (stillCount < 10) {
preview.mCamera.takePicture(shutterCallback, rawCallback,
jpegCallback);
if (stillCount == 9) {
frameLayout.setClickable(true);
}
} else {
stillCount = 0;
takePictureButton.setEnabled(true);
frameLayout.setClickable(true);
}
} catch (Exception e) {
Log.d(TAG, "Error starting preview: " + e.toString());
}
}
};