Xamarin Camera2Basic示例在UnlockFocus调用后抛出异常

时间:2017-07-27 06:47:01

标签: android xamarin android-camera2

下载Xamarin Camera2Basic项目

最初所有工作正常,因为它在Visual Studio 2017模拟器中开始测试。

如下所示在“CameraCaptureStillPictureSessionCallback.cs”中注释掉代码,以便在点击“拍照”按钮后,将捕获的静止图像显示在仿真器屏幕上:

public override void OnCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result)
{
    //Owner.ShowToast("Saved: " + Owner.mFile);
    //Log.Debug(TAG, Owner.mFile.ToString());
    //Owner.UnlockFocus();
}

单击“拍照”按钮隐藏自己,并在屏幕上显示另一个标有“重拍图片”的按钮(事后我添加了该代码,代码位于Camera2BasicFragment.cs文件中,但代码无关紧要问题)。

单击现在可见的“重拍图片”按钮可执行以下操作:

  1. 隐藏自己
  2. 显示“拍照”按钮
  3. 调用UnlockFocus()
  4. UnlockFocus()允许相机的流在屏幕上连续显示,而不是之前拍摄的静止图像。

    现在,当我再次单击“拍照”按钮(尝试捕获新的静止图像)时,应用程序崩溃。

    Visual Studio不提供任何有意义的错误消息。最接近的有用信息是设备日志中显示的错误消息:

    07-26 23:29:03.201   10.1" Marshmallow (6.0.0) XHDPI Tablet Error   6987    BufferQueueProducer [ImageReader-640x480f100m2-6987-0] dequeueBuffer: can't dequeue multiple buffers without setting the buffer count  
    07-26 23:29:07.174   10.1" Marshmallow (6.0.0) XHDPI Tablet Error   6987    RequestThread-0 Hit timeout for jpeg callback!  
    07-26 23:29:03.201   10.1" Marshmallow (6.0.0) XHDPI Tablet Error   6987    Legacy-CameraDevice-JNI LegacyCameraDevice_nativeProduceFrame: Error while producing frame Function not implemented (-38).
    

    我不确定如何处理这些错误,或者更改哪些设置/代码以允许“重新拍摄图片”功能在不崩溃应用的情况下工作。

    有什么建议吗?

    编辑1: 每个请求,我目前拥有的项目链接在哪里。

    https://drive.google.com/file/d/0B7OSuA_ybXcFb081T210UlQzZkE/view?usp=sharing

    以下是其他一些看似相关的信息:

    1. 此代码使用以下命令运行:

      一个。 Windows 10 Pro,Visual Studio 2017社区,Android模拟器 对于Visual Studio,Hyper-v Virtual Manager,Android 6.0 (Marshamallow SDK 23),平板电脑大小的模板

      湾2013 Macbook Pro,Visual Studio For Mac(最新版本),默认 emaulator,Android 6.0(Marshmallow SDK 23),平板电脑大小的模板。

    2. 在两种环境中都观察到在第二次“LockFocus”调用后无法拍摄快照。

    3. Mac更容易找到一些更有意思的错误:

      一个。我看到的错误发生在方法“produceFrame”里面 LegacyCameraDevice.java

2 个答案:

答案 0 :(得分:1)

我也解决了这个演示的问题,这背后的真正问题是关于IOnImageAvailableListener,它不会触发OnImageAvailable方法来保存图片......

在阅读完代码后,我发现演示已经破了,它遗漏了一些。 在Camera2BasicFragment.cs中,在OnCreateMethod中,您需要添加此行

mCaptureCallback = new CameraCaptureListener() { Owner = this};

整个方法应如下所示:

public override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        mStateCallback = new CameraStateListener() { owner = this };
        mSurfaceTextureListener = new Camera2BasicSurfaceTextureListener(this);

        // fill ORIENTATIONS list
        ORIENTATIONS.Append((int)SurfaceOrientation.Rotation0, 90);
        ORIENTATIONS.Append((int)SurfaceOrientation.Rotation90, 0);
        ORIENTATIONS.Append((int)SurfaceOrientation.Rotation180, 270);
        ORIENTATIONS.Append((int)SurfaceOrientation.Rotation270, 180);
    }

有趣的是,如果你在模拟器上运行它,什么都不会发生,因为在CameraCaptureListener.cs文件中,这将始终返回0,而不是ControlAFState.FocusedLocked或ControlAFState.InActivate

Integer afState = (Integer)result.Get(CaptureResult.ControlAfState);

如果我破解了If方法能够运行跳转到下一步的事件,那么ImageAvailableListener.cs的方法OnImageAvaiable永远不会被模拟器触发。但如果我在真实设备上运行,它运行正常吗?!

所以修复是: 1.像我在onCreate函数中解释的那样添加上面的代码。 2.不要使用模拟器来运行Camera2,它有问题。

希望有所帮助:)

答案 1 :(得分:0)

如果您仍然感兴趣; IOnImageAvailableListener不会在Android的Visual Studio模拟器中触发 OnImageAvailable方法

代码正确,但是适用于Android的Visual Studio模拟器有一个错误。我希望他们尽快修复它。另一方面,您可以使用Android Studio Emulator在Xamarin中尝试代码,而不会出现任何错误。这很容易,您不需要了解任何有关Java或Android Studio的信息,只需按照以下步骤操作

  1. 使用虚拟设备安装Android Studio
  2. 关闭PC上的Hper-v(Windows->控制面板->程序->程序和功能->打开或关闭Windows功能)
  3. 打开android studio->工具-> Avd Manager->创建虚拟设备

Visual Studio检测到虚拟设备,只需在Visual Studio Xamarin上使用它即可

希望有帮助