CWAC Camera — реализация кнопки переключения камеры

Я пытаюсь создать кнопку переключения камеры с помощью своего пользовательского графического интерфейса. В моем CustomCam extends SherlockFragmentActivity у меня есть метод onSwitch(), который вызывается из xml android:onClick="onSwitch"

Вот метод:

public void onClickSwitchButton(View view) {
        if (current == std) {
            ffc = CustomCamFragment.newInstance(true);
            current = ffc;
            getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, current).commit();
            isFrontCamera=true;

            return;

        }


        if (current == ffc) {
            std = CustomCamFragment.newInstance(false);
            current = std;
            isFrontCamera=false;
        }

        getSupportFragmentManager().beginTransaction()
                .replace(R.id.container, current).commit();
    }

Я знаю, что метод срабатывает из-за точек останова и операторов журнала, но мой экран просто становится черным, а затем возвращается в виде того же стандартного представления.

Примечание. Я понимаю, что мне нужно определить, есть ли в телефоне более 1 камеры или вообще нет камер. Но пока это приложение я не буду публиковать. Просто хочу это для моего личного использования.

Мой CustomCamFragment:

public class CustomCamFragment extends CameraFragment {

private static final String KEY_USE_FFC = "com.commonsware.cwac.camera.demo.USE_FFC";

public static CustomCamFragment newInstance(boolean useFFC) {
    CustomCamFragment f = new CustomCamFragment();
    Bundle args = new Bundle();

    args.putBoolean(KEY_USE_FFC, useFFC);
    f.setArguments(args);
    return (f);
}

person Community    schedule 20.02.2014    source источник
comment
но мой экран просто становится черным, а затем возвращается к тому же стандартному виду - я понятия не имею, что вы подразумеваете под этим, извините.   -  person CommonsWare    schedule 20.02.2014
comment
Кажется, что он пытается переключиться на ffc (временно становится черным), но сразу же возвращается с видеопотоком со стандартной камеры.   -  person    schedule 20.02.2014


Ответы (3)


Ну, я понятия не имею, что такое CustomCamFragment. Однако ваш код, похоже, не переключается на другую камеру. Вы создаете CustomCamFragment через его конструктор и не указываете, какую камеру использовать. Вы заметите, что демонстрационное приложение работает не так, как я использую фабричный метод и укажите, какую камеру использовать (DemoCameraFragment.newInstance(false) для задней камеры, DemoCameraFragment.newInstance(true) для передней камеры).

person CommonsWare    schedule 20.02.2014
comment
Я включил свой код CustomCamFragment выше. Он должен быть идентичен вашему. Я не уверен, почему это не работает. Не могли бы вы взглянуть? Я использую Demo-v9 в качестве примера, но до сих пор не понимаю, что может быть причиной того, что он не переключается. - person ; 20.02.2014
comment
@ user2676468: Одна проблема, вероятно, не связанная с этим, заключается в том, что вы каждый раз создаете новые экземпляры CustomCamFragment. Создавайте только одну для каждой камеры, повторно используя существующий экземпляр, если он у вас есть. Кроме того, вы используете значение из ваших аргументов Bundle? В демонстрационном приложении это находится в useFrontFacingCamera() во внутреннем классе DemoCameraHost DemoCameraFragment. - person CommonsWare; 20.02.2014
comment
Хм... Я использую свой собственный хост-класс камеры. public class CustomCamHost extends SimpleCameraHost и не использует метод useFrontFacingCamera(). Теперь, как мне передать этому классу истинное или ложное значение? - person ; 20.02.2014
comment
@user2676468: user2676468: Прочтите это из аргументов Bundle (getArguments().getBoolean(KEY_USE_FFC)). - person CommonsWare; 20.02.2014
comment
Я не получаю пакет в своем классе CustomCamHost, так как все, что он делает, это расширяет SimpleCameraHost. Я думаю, может быть, мне просто нужно отказаться от моего файла CustomCamHost.java и попытаться интегрировать его в мой CustomCamFragment в качестве внутреннего класса? - person ; 20.02.2014
comment
@ user2676468: Либо так, либо создайте новый экземпляр CustomCamHost для каждого фрагмента, передав флаг FFC экземпляру CustomCamHost (конструктору, сеттеру и т. д.). - person CommonsWare; 21.02.2014
comment
Хм... кажется, мне нужно реализовать CameraHostProvider в действии. Как мне указать, что я хочу использовать тот, что в моем фрагменте? - person ; 21.02.2014

Чтобы ответить на ваш последний комментарий о встраивании во фрагменты: я отключил throw new IllegalArgumentException(...) из конструктора CameraView в библиотеке и сам вызываю setHost из своего пользовательского CameraFragment в onCreateView. Таким образом, контекст CameraView не обязательно должен быть CameraHostProvider, и вы можете разместить представление внутри фрагмента.

person mvandillen    schedule 15.08.2014

Я хочу переключить переднюю/заднюю камеру, не нажимая новый фрагмент. Изучив код CameraView и CameraHost (SimpleCameraHost), я думаю, что лучшим решением будет просто удалить текущий экземпляр CameraView и добавить новый:

public class MyCameraFragment extends CameraFragment {

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    addCameraView(view);
}

private void addCameraView(View view) {
    FrameLayout frame = (FrameLayout)v.findViewById(R.id.cameraFrame);
    frame.removeAllViews();
    cameraView = new CameraView(getActivity());
    cameraView.setHost(cameraHost = new MyCameraHost(getActivity()));
    setCameraView(cameraView);
    frame.addView(cameraView);
}

private void doSwitchCamera() {
    // do some change to the settings.
    useFrontFacingCamera = !useFrontFacingCamera;
    if (null != cameraView) {
        cameraView.onPause();
    }
    addCameraView(getView());
 cameraView.onResume();
}

}

Я надеюсь, что это может помочь кому-то, кто хочет сохранить свой фрагмент нетронутым/простым кодом.

person John Pang    schedule 02.11.2014