public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener{ private static final int PERMISSION_REQUESTS = 1; private CameraSource cameraSource = null; private CameraSourcePreview preview; private GraphicOverlay graphicOverlay; private static final String TAG = "Barcode Scanning"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); preview = findViewById(R.id.firePreview); graphicOverlay = findViewById(R.id.fireFaceOverlay); ToggleButton facingSwitch = findViewById(R.id.facingswitch); facingSwitch.setOnCheckedChangeListener(this); if (allPermissionsGranted()) { createCameraSource(); startCameraSource(); } else { getRuntimePermissions(); } } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (cameraSource != null) { if (isChecked) { cameraSource.setFacing(CameraSource.CAMERA_FACING_FRONT); } else { cameraSource.setFacing(CameraSource.CAMERA_FACING_BACK); } } preview.stop(); startCameraSource(); } private void createCameraSource() { // If there's no existing cameraSource, create one. if (cameraSource == null) { cameraSource = new CameraSource(this, graphicOverlay); } cameraSource.setMachineLearningFrameProcessor(new BarcodeScanningProcessor()); } /** * Starts or restarts the camera source, if it exists. If the camera source doesn't exist yet * (e.g., because onResume was called before the camera source was created), this will be called * again when the camera source is created. */ private void startCameraSource() { if (cameraSource != null) { try { if (preview == null) { Log.d(TAG, "resume: Preview is null"); } if (graphicOverlay == null) { Log.d(TAG, "resume: graphOverlay is null"); } preview.start(cameraSource, graphicOverlay); } catch (IOException e) { cameraSource.release(); cameraSource = null; } } } @Override public void onResume() { super.onResume(); startCameraSource(); } /** Stops the camera. */ @Override protected void onPause() { super.onPause(); preview.stop(); } @Override public void onDestroy() { super.onDestroy(); if (cameraSource != null) { cameraSource.release(); } } private boolean allPermissionsGranted() { for (String permission : getRequiredPermissions()) { if (!isPermissionGranted(this, permission)) { return false; } } return true; } private void getRuntimePermissions() { ListallNeededPermissions = new ArrayList<>(); for (String permission : getRequiredPermissions()) { if (!isPermissionGranted(this, permission)) { allNeededPermissions.add(permission); } } if (!allNeededPermissions.isEmpty()) { ActivityCompat.requestPermissions( this, allNeededPermissions.toArray(new String[0]), PERMISSION_REQUESTS); } } private String[] getRequiredPermissions() { try { PackageInfo info = this.getPackageManager() .getPackageInfo(this.getPackageName(), PackageManager.GET_PERMISSIONS); String[] ps = info.requestedPermissions; if (ps != null && ps.length > 0) { return ps; } else { return new String[0]; } } catch (Exception e) { return new String[0]; } } @Override public void onRequestPermissionsResult( int requestCode, String[] permissions, int[] grantResults) { if (allPermissionsGranted()) { createCameraSource(); startCameraSource(); } super.onRequestPermissionsResult(requestCode, permissions, grantResults); } private static boolean isPermissionGranted(Context context, String permission) { if (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED) { return true; } return false; } }