【问题标题】:CWAC Camera - Implementing switch camera buttonCWAC 摄像头 - 实现切换摄像头按钮
【发布时间】:2014-02-20 19:09:44
【问题描述】:

我正在尝试使用我的自定义 gui 创建一个切换相机按钮。在我的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();
    }

我知道该方法触发是因为断点和日志语句,但我的屏幕只是变黑,然后以相同的 std 视图返回。

注意:我意识到我必须检测手机是否有多个摄像头,或者根本没有摄像头。但就目前而言,这个应用程序不是我要发布的东西。只是想要它供我个人使用。

我的 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);
}

【问题讨论】:

  • “但是我的屏幕只是变黑了,然后又以相同的标准视图返回”——我不明白你的意思,抱歉。
  • 它似乎试图切换到 ffc(暂时变黑),但它会立即返回来自 std 摄像头的视频。

标签: android camera commonsware-cwac


【解决方案1】:

好吧,我不知道CustomCamFragment 是什么。但是,您的代码似乎并没有真正切换到另一台相机。您正在通过其构造函数创建CustomCamFragment,而不是告诉它要使用什么相机。你会注意到the demo app 不是这样工作的,我使用工厂方法并传入要使用的摄像头(DemoCameraFragment.newInstance(false) 用于后置摄像头,DemoCameraFragment.newInstance(true) 用于前置摄像头)。

【讨论】:

  • 我在上面包含了我的 CustomCamFragment 代码。它应该与您的相同。我不确定为什么它不起作用。你能看看吗?我以 Demo-v9 为例,但仍然不明白是什么原因导致它无法切换。
  • @user2676468:一个可能不相关的问题是您每次都在创建新的CustomCamFragment 实例。每个相机只创建一个,如果你有一个现有的实例,可以重用它。除此之外,您是否使用了参数Bundle 中的值?在演示应用程序中,位于DemoCameraHost 内部类DemoCameraFragment 上的useFrontFacingCamera()
  • 嗯...我正在使用我自己的相机主机类。 public class CustomCamHost extends SimpleCameraHost 并且它没有使用 useFrontFacingCamera() 方法。现在我应该如何向该类传递一个真值或假值?
  • @user2676468:从Bundle (getArguments().getBoolean(KEY_USE_FFC)) 的参数中读出。
  • 我的 CustomCamHost 类中没有捆绑包,因为它所做的只是扩展 SimpleCameraHost。我想也许我应该放弃我的 CustomCamHost.java 文件并尝试将它作为内部类集成到我的 CustomCamFragment 中?
【解决方案2】:

回答您关于嵌入片段的最后评论:我已从库中的 CameraView 构造函数中禁用了 throw new IllegalArgumentException(...),并且我自己从 onCreateView 中的自定义 CameraFragment 中调用了 setHost。这样,CameraView 的上下文不必是CameraHostProvider,您可以将视图托管在片段中。

【讨论】:

    【解决方案3】:

    我想在不推送新片段的情况下切换前置/后置摄像头。研究了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();
    }
    
    }
    

    我希望这可以帮助那些想要保持片段不变/简单代码的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-31
      • 2020-11-14
      • 2018-09-04
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      相关资源
      最近更新 更多