8

カスタム カメラを使用して Android アプリを作成しており、新しい camera2 API に切り替えています。バックカメラがオンのときにフラッシュをオン/オフできるボタンがあります(従来のカメラアプリのようにカメラを停止する必要はありません)。

フラッシュ アイコンをタップしても何も起こらず、logcat は次のように返します。

D/ViewRootImpl: ViewPostImeInputStage processPointer 0
D/ViewRootImpl: ViewPostImeInputStage processPointer 1

なぜ機能しないのかわかりません。コードは次のとおりです。

RecordVideoActivity使用していRecordVideoFragmentます。以下は、フラッシュ ボタン コードを含むフラグメントの XML 部分です。

<ImageButton
    android:id="@+id/button_flash"
    android:src="@drawable/ic_flash_off"
    android:layout_alignParentLeft="true"
    style="@style/actions_icons_camera"
    android:onClick="actionFlash"/>

そしてJavaコード:

ImageButton flashButton;
private boolean hasFlash;
private boolean isFlashOn = false;

onViewCreated

@Override
public void onViewCreated(final View view, Bundle savedInstanceState) {
    ...
    [some code]
    ...
    // Flash on/off button
    flashButton = (ImageButton) view.findViewById(R.id.button_flash);
    // Listener for Flash on/off button
    flashButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            actionFlash();
        }
    });

そして、ここにactionFlash()関数定義があります:

private void  actionFlash() {

    /* First check if device is supporting flashlight or not */
    hasFlash = getActivity().getApplicationContext().getPackageManager()
            .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);

    if (!hasFlash) {
        // device doesn't support flash
        // Show alert message and close the application
        AlertDialog alert = new AlertDialog.Builder(this.getActivity())
                .create();
        alert.setMessage("Sorry, your device doesn't support flash light!");
        alert.setButton(DialogInterface.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        alert.show();
        return;
    }
    else {  // the device support flash
        CameraManager mCameraManager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);
        try {
            String mCameraId = mCameraManager.getCameraIdList()[0];
            if (mCameraId.equals("1")) {    // currently on back camera
                if (!isFlashOn) {  // if flash light was OFF
                    // Turn ON flash light
                    try {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                            mCameraManager.setTorchMode(mCameraId, true);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    // Change isFlashOn boolean value
                    isFlashOn = true;
                    // Change button icon
                    flashButton.setImageResource(R.drawable.ic_flash_off);

                } else { // if flash light was ON
                    // Turn OFF flash light
                    try {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                            mCameraManager.setTorchMode(mCameraId, false);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    // Change isFlashOn boolean value
                    isFlashOn = false;
                    // Change button icon
                    flashButton.setImageResource(R.drawable.ic_flash_on);
                }
            }
        } catch (CameraAccessException e) {
            Toast.makeText(getActivity(), "Cannot access the camera.", Toast.LENGTH_SHORT).show();
            getActivity().finish();
        }
    }
}

何が間違っている可能性がありますか?

(私はすでにこの質問を見ましたが、それは私の問題に対処していません)

ご助力ありがとうございます。これは私を夢中にさせています。

4

5 に答える 5

19

次の変数を作成します。

    public static final String CAMERA_FRONT = "1";
    public static final String CAMERA_BACK = "0";

    private String cameraId = CAMERA_BACK;
    private boolean isFlashSupported;
    private boolean isTorchOn;

次に、これらのメソッドを追加します。

public void switchFlash() {
    try {
        if (cameraId.equals(CAMERA_BACK)) {
            if (isFlashSupported) {
                if (isTorchOn) {
                    mPreviewBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
                    mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, null);
                    flashButton.setImageResource(R.drawable.ic_flash_off);
                    isTorchOn = false;
                } else {
                    mPreviewBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH);
                    mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, null);
                    flashButton.setImageResource(R.drawable.ic_flash_on);
                    isTorchOn = true;
                }
            }
        }
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

public void setupFlashButton() {
    if (cameraId.equals(CAMERA_BACK) && isFlashSupported) {
        flashButton.setVisibility(View.VISIBLE);

        if (isTorchOn) {
            flashButton.setImageResource(R.drawable.ic_flash_off);
        } else {
            flashButton.setImageResource(R.drawable.ic_flash_on);
        }

    } else {
        flashButton.setVisibility(View.GONE);
    }
}

この行の後に次のコードを追加します。

Boolean available = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
isFlashSupported = available == null ? false : available;

setupFlashButton();

最後に、目的のクリックリスナーでswitchFlash()を呼び出します。

ほら!

PS。これは役に立つかもしれません -前面/背面カメラ スイッチャー

于 2016-08-21T15:39:52.807 に答える
2

cameraX の場合、ImageCapture.flashMode は、初期構成、ImageCapture.Builder() などでビルドするときにのみ有効です。ただし、フラッシュを動的に有効/無効にする場合は、次を使用する必要があります。

camera?.cameraControl?.enableTorch(enableFlash)

カメラって何?と思ったら?ドキュメントからキャプチャしました。

// A variable number of use-cases can be passed here -
// camera provides access to CameraControl & CameraInfo
camera = cameraProvider.bindToLifecycle(
this, cameraSelector, preview, imageCapture
)
于 2020-12-31T04:20:53.647 に答える
-1

コードの問題は「mCameraManager.setTorchMode(mCameraId, true) ;」です。この呼び出しには API 23 以降が必要です。したがって、API 23 より前の API からこのネイティブ メソッドを呼び出すことはできません。できることは、非推奨の Camera API を使用することです。これはすべてのデバイスで機能し、近い将来、かなりの期間にわたって機能し続けるでしょう. これができることです。if-else ステートメントを使用してこのコードを追加します。デバイスが API23+ の場合は Camera2 を使用し、それ以外の場合は Camera を使用します。それが私がすることです。

インポートに hardware.Camera を追加します

import android.hardware.Camera;

変数の初期化

Camera camera;
Camera.Parameters params;

さあ、カメラを手に入れてフラッシュをオンにしましょう

try {
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
       mCameraManager.setTorchMode(CameraId, true);
     } 
else {
camera = Camera.open();
params = camera.getParameters();
params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(params);
camera.startPreview();
}
catch (Exception e) 
{
 e.printStackTrace();
  }

そして、あなたは行ってもいいです。

于 2016-09-02T09:11:06.150 に答える