私の場合を説明します。 私は、5秒ごとに画像を撮る、フラッシュなしで撮る、そして5秒後にフラッシュで撮影するアプリケーションをしようとしています。毎回これを繰り返します。だから、フラッシュなし、フラッシュなし、フラッシュなし、フラッシュ付き...無限に1つを取るでしょう。カメラ2のAPIの問題点滅のフラッシュ/フラッシュイメージなし
私のコードでは、いくつかのデバイスでこれを行うことができますが、同じコードは他のデバイスでも動作しません。すなわち:
- BQ Aquaris X5プラス:フラッシュなしの画像が正しいですが、フラッシュ画像がちょうど白になります。
- BQ Aquaris E5:フラッシュは発光しません。
どのように私が試したすべてのデバイスは、Camera2 APIのLEGACYハードウェアサポートレベルです。
これは私のコードでいくつかの重要なメソッドです(私は文字制限のためにすべてのコードを投稿できません)。私はGoogleの例から始めました:
このsetAutoFlashは上記のことを行います。
private void setAutoFlash(CaptureRequest.Builder requestBuilder) {
if (mFlashSupported) {
if(phototaken) {
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
}else{
requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE);
}
}
}
この他のデバイスとbq aquaris e5では動作しますが、bq aquaris x5 plusではフラッシュは起動しません。
private void setAutoFlash(CaptureRequest.Builder requestBuilder) {
if (mFlashSupported) {
if(phototaken) {
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
}else{
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
}
}
}
そして、私のcaptureStillPicture
private void captureStillPicture() {
try {
final Activity activity = getActivity();
if (null == activity || null == mCameraDevice) {
return;
}
// This is the CaptureRequest.Builder that we use to take a picture.
final CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.addTarget(mImageReader.getSurface());
// Use the same AE and AF modes as the preview.
captureBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
setAutoFlash(captureBuilder);
// Orientation
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation));
CameraCaptureSession.CaptureCallback CaptureCallback
= new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session,
@NonNull CaptureRequest request,
@NonNull TotalCaptureResult result) {
showToast("Saved: " + mFile);
Log.d(TAG, mFile.toString());
unlockFocus();
}
};
mCaptureSession.stopRepeating();
mCaptureSession.capture(captureBuilder.build(), CaptureCallback, null);
phototaken = !phototaken;
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
それはすべてのデバイスでは動作しませんので質問は、私が間違って何をやっているのですか?どんな助けも素晴らしいでしょう。
こんにちは@Eddy、あなたの答えに感謝します。しかし、それはまだ動作しません。 AE_MODEをAE_MODE_ONに設定してから、FLASH_MODEを変更します。あなたが言及しているように私は、サンプルアプリケーションCamera2Basicを使用しています、そして私は知っている限り、lockFocusメソッドでprecaptureシーケンスを実行します。写真を撮影するには、サンプルと同じようにこのメソッドを呼び出します。だから、私もprecaptureシーケンスを発射していると仮定します。 – Ivan