3

I have a similar question to this question and this question, neither of which have an accepted solution.

I'm basically using the Google Vision barcode API but there appears no obvious way to control the flashlight.

This answer suggests using this code, but (having tried and failed) I'm not sure how to integrate it into my app.

Here is the code for my activity, which basically starts the camera/barcode scanner and also uses a menu item from my BaseActivity which I want to use to be able to toggle the flashlight:

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.util.SparseArray;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import com.google.android.gms.common.api.CommonStatusCodes;
import com.google.android.gms.vision.Detector;
import com.google.android.gms.vision.barcode.Barcode;
import com.google.android.gms.vision.barcode.BarcodeDetector;
import java.io.IOException;

public class ScanQRCodeAutoActivity extends BaseActivity {

    private static final String LOG_TAG = ScanQRCodeAutoActivity.class.getSimpleName();

    private static final int CAMERA_SOURCE_PREVIEW_WIDTH = -1;
    private static final int CAMERA_SOURCE_PREVIEW_HEIGHT = 480;
    public static final String QR_CODE_VALUE = "QR_CODE_VALUE";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scan_qr_code_auto);

        super.initFlash(savedInstanceState);

        final SurfaceView cameraSurfaceView = (SurfaceView)findViewById(R.id.cameraSurfaceView);

        BarcodeDetector.Builder barcodeDetectorBuilder = new BarcodeDetector.Builder(this);
        barcodeDetectorBuilder.setBarcodeFormats(Barcode.QR_CODE);
        BarcodeDetector barcodeDetector = barcodeDetectorBuilder.build();
        barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
            @Override
            public void release() {
            }

            @Override
            public void receiveDetections(Detector.Detections<Barcode> detections) {

                final SparseArray<Barcode> barcodes = detections.getDetectedItems();

                if (barcodes.size() != 0) {

                    Intent data = new Intent();
                    data.putExtra(QR_CODE_VALUE, barcodes.valueAt(0).displayValue);
                    setResult(CommonStatusCodes.SUCCESS, data);
                    finish();

                }

            }
        });

        CameraSource.Builder cameraSourceBuilder = new CameraSource.Builder(this, barcodeDetector);
        //cameraSourceBuilder.setAutoFocusEnabled(true);
        //cameraSourceBuilder.setFacing(CameraSource.CAMERA_FACING_BACK);
        if (CAMERA_SOURCE_PREVIEW_WIDTH != -1 && CAMERA_SOURCE_PREVIEW_HEIGHT != -1) {
            cameraSourceBuilder.setRequestedPreviewSize(CAMERA_SOURCE_PREVIEW_WIDTH, CAMERA_SOURCE_PREVIEW_HEIGHT);
        }

        final CameraSource cameraSource = cameraSourceBuilder.build();

        cameraSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {

                try {
                    cameraSource.start(cameraSurfaceView.getHolder());

                }
                catch (SecurityException se) {
                    Log.e(LOG_TAG, "Could not start camera source.", se);
                }
                catch (IOException ioe) {
                    Log.e(LOG_TAG, "Couldn't start camera source.", ioe);
                }

            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {

                cameraSource.stop();

            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        MenuItem flashItem = menu.findItem(R.id.action_flash);
        flashItem.setVisible(true);

        return true;
    }

    @Override
    protected void toggleFlash() {

        super.toggleFlash();

        // HELP!!

        invalidateOptionsMenu();
        if (isFlashOn()) {
            Utilities.makeToast(this, "Flash turned on");
        }
        else {
            Utilities.makeToast(this, "Flash turned off");
        }

    }
}
Community
  • 1
  • 1
ban-geoengineering
  • 18,324
  • 27
  • 171
  • 253

0 Answers0