Camera Controls

The CameraManager allows you to switch between front and back camera, continuous focus and one time focus as well as control the zoom. We created a activity_camera_control.xml layout file, were we define some simple ui components for all exposed settings, please browse the sample app code if you would like to have a look at this file.

With the layout file in place we are ready to connect the UI components and the CameraManager.

The first component we connect is the flash light on/off switch, were we set a anonymous OnCheckedChangeListener in which we retrieve the CameraManager from the WikitudeSDK and enable or disable the flash light by calling enableCameraFlash or disableCameraFlash.

For the zoom SeekBar we first set the maximum value of the SeekBar to the maximum zoom value returned by the CameraManager, to create a wider range of values we multiply the returned value by 100. Then again we set a anonymous Listener to react on the user input. Since we widened the value range, we need to divide the current Seekbar value by 100 before we pass it back to the CameraManager by calling setZoomLevel.

    @Override
    public void onRenderExtensionCreated(final RenderExtension renderExtension_) {

        ...

        Switch flashToggleButton = (Switch) findViewById(R.id.flashlight);
        flashToggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(final CompoundButton buttonView, final boolean isChecked) {
                if (isChecked) {
                    _wikitudeSDK.getCameraManager().enableCameraFlashLight();
                } else {
                    _wikitudeSDK.getCameraManager().disableCameraFlashLight();
                }

            }
        });

        SeekBar zoomSeekBar = (SeekBar) findViewById(R.id.zoomSeekBar);
        zoomSeekBar.setMax(((int) _wikitudeSDK.getCameraManager().getMaxZoomLevel()) * 100);
        zoomSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(final SeekBar seekBar, final int progress, final boolean fromUser) {
                if (progress > 0) {
                    _wikitudeSDK.getCameraManager().setZoomLevel((float) progress / 100.0f);
                }
            }

            @Override
            public void onStartTrackingTouch(final SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(final SeekBar seekBar) {

            }
        });

Since we use two Spinners to control the camera position and focus mode, we don't go with anonymous listeners, but let the activity implement onItemSelectedListener and handle both spinners in the same method. For both focus mode and camera position CameraManager exposes setters to pick a value. We use the appropriate enums provided by the CameraSettings class to choose from the available settings.

    @Override
    public void onRenderExtensionCreated(final RenderExtension renderExtension_) {

        ...

        Spinner cameraPositionSpinner = (Spinner) findViewById(R.id.cameraPosition);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.camera_positions, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        cameraPositionSpinner.setAdapter(adapter);
        cameraPositionSpinner.setOnItemSelectedListener(this);

        Spinner focusModeSpinner = (Spinner) findViewById(R.id.focusMode);
        adapter = ArrayAdapter.createFromResource(this, R.array.focus_mode, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        focusModeSpinner.setAdapter(adapter);
        focusModeSpinner.setOnItemSelectedListener(this);
    }

    @Override
    public void onItemSelected(final AdapterView<?> adapterView_, final View view_, final int position, final long id) {
        switch (adapterView_.getId()) {
            case R.id.focusMode:
                if (position == 0) {
                    _wikitudeSDK.getCameraManager().setFocusMode(CameraSettings.CameraFocusMode.CONTINUOUS);
                } else {
                    _wikitudeSDK.getCameraManager().setFocusMode(CameraSettings.CameraFocusMode.ONCE);
                }
                break;
            case R.id.cameraPosition:
                if (position == 0) {
                    _wikitudeSDK.getCameraManager().setCameraPosition(CameraSettings.CameraPosition.BACK);
                } else {
                    _wikitudeSDK.getCameraManager().setCameraPosition(CameraSettings.CameraPosition.FRONT);
                }
                break;
        }
    }