下载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文件中,但代码无关紧要问题)。
单击现在可见的“重拍图片”按钮可执行以下操作:
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
以下是其他一些看似相关的信息:
此代码使用以下命令运行:
一个。 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),平板电脑大小的模板。
在两种环境中都观察到在第二次“LockFocus”调用后无法拍摄快照。
Mac更容易找到一些更有意思的错误:
一个。我看到的错误发生在方法“produceFrame”里面 LegacyCameraDevice.java
答案 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的信息,只需按照以下步骤操作
Visual Studio检测到虚拟设备,只需在Visual Studio Xamarin上使用它即可
希望有帮助