public class MainActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback, AdapterView.OnItemSelectedListener, CompoundButton.OnCheckedChangeListener { private static final String ON_DEVICE_LABELLING = "On-device labeling"; private static final String CLOUD_LABELLING = "Cloud labeling"; private static final String TAG = "LivePreviewActivity"; private static final int PERMISSION_REQUESTS = 1; private CameraSource cameraSource = null; private CameraSourcePreview preview; private GraphicOverlay graphicOverlay; private String selectedModel = ON_DEVICE_LABELLING; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "onCreate"); setContentView(R.layout.activity_main); preview = (CameraSourcePreview) findViewById(R.id.firePreview); if (preview == null) { Log.d(TAG, "Preview is null"); } graphicOverlay = (GraphicOverlay) findViewById(R.id.fireFaceOverlay); if (graphicOverlay == null) { Log.d(TAG, "graphicOverlay is null"); } Spinner spinner = (Spinner) findViewById(R.id.spinner); Listoptions = new ArrayList<>(); options.add(ON_DEVICE_LABELLING); options.add(CLOUD_LABELLING); // Creating adapter for spinner ArrayAdapter dataAdapter = new ArrayAdapter<>(this, R.layout.spinner_style, options); // Drop down layout style - list view with radio button dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // attaching data adapter to spinner spinner.setAdapter(dataAdapter); spinner.setOnItemSelectedListener(this); ToggleButton facingSwitch = (ToggleButton) findViewById(R.id.facingswitch); facingSwitch.setOnCheckedChangeListener(this); if (allPermissionsGranted()) { createCameraSource(selectedModel); } else { getRuntimePermissions(); } } @Override public synchronized void onItemSelected(AdapterView> parent, View view, int pos, long id) { // An item was selected. You can retrieve the selected item using // parent.getItemAtPosition(pos) selectedModel = parent.getItemAtPosition(pos).toString(); Log.d(TAG, "Selected model: " + selectedModel); preview.stop(); if (allPermissionsGranted()) { createCameraSource(selectedModel); startCameraSource(); } else { getRuntimePermissions(); } } @Override public void onNothingSelected(AdapterView> parent) { // Do nothing. } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { Log.d(TAG, "Set facing"); if (cameraSource != null) { if (isChecked) { cameraSource.setFacing(CameraSource.CAMERA_FACING_FRONT); } else { cameraSource.setFacing(CameraSource.CAMERA_FACING_BACK); } } preview.stop(); startCameraSource(); } private void createCameraSource(String model) { // If there's no existing cameraSource, create one. if (cameraSource == null) { cameraSource = new CameraSource(this, graphicOverlay); } switch (model) { case ON_DEVICE_LABELLING: Log.i(TAG, "Using Image Label Detector Processor ondevice"); cameraSource.setMachineLearningFrameProcessor(new ImageLabelingProcessor()); break; case CLOUD_LABELLING: Log.i(TAG, "Using Image Label Detector Processor cloud"); cameraSource.setMachineLearningFrameProcessor(new CloudImageLabelingProcessor()); break; default: Log.e(TAG, "Unknown model: " + model); } } /** * 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) { Log.e(TAG, "Unable to start camera source.", e); cameraSource.release(); cameraSource = null; } } } @Override public void onResume() { super.onResume(); Log.d(TAG, "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 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]; } } private boolean allPermissionsGranted() { for (String permission : getRequiredPermissions()) { if (!isPermissionGranted(this, permission)) { return false; } } return true; } private void getRuntimePermissions() { List allNeededPermissions = 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); } } @Override public void onRequestPermissionsResult( int requestCode, String[] permissions, int[] grantResults) { Log.i(TAG, "Permission granted!"); if (allPermissionsGranted()) { createCameraSource(selectedModel); } super.onRequestPermissionsResult(requestCode, permissions, grantResults); } private static boolean isPermissionGranted(Context context, String permission) { if (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED) { Log.i(TAG, "Permission granted: " + permission); return true; } Log.i(TAG, "Permission NOT granted: " + permission); return false; } }