首页 > 解决方案 > 在 Xamarin 中显示相机流

问题描述

我想在页面内显示相机的流。像那样:

我的应用程序中的相机视图

该应用程序主要在 Windows 10 上运行。我已将 Fall Creators Update (16299) 设置为 Windows 的最低版本。

我找到了 CameraView (来自 Xamarin Community Toolkit - 1.2.0),但它不起作用......说明:

我使用状态(来自工具包):

我使用由 Visual Studio 模板生成的基本 MVVM 模式。我的页面在 XAML 中附加到 ViewModel:

<ContentPage ...>
<ContentPage.BindingContext>
    <vm:FooViewModel />
</ContentPage.BindingContext>

<ContentPage.Content>
    <Grid ...>
        <xct:StateLayout.StateViews>

            <xct:StateView StateKey="Loading">
                <ActivityIndicator .../>
            </xct:StateView>

            <xct:StateView StateKey="None" 
                           VerticalOptions="FillAndExpand"
                           HorizontalOptions="FillAndExpand">

                <xct:CameraView VerticalOptions="FillAndExpand"
                                HorizontalOptions="FillAndExpand"
                                CaptureMode="Photo"
                                CameraOptions="Default"/>
            </xct:StateView>
        </xct:StateLayout.StateViews>

        <CollectionView Grid.Column="1"/>

    </Grid>
</ContentPage.Content>

我尝试将 CameraView 控件移到 StateLayout 之外。该控件显示在“实时可视树”中,但相机不显示流。

在 UWP 上:

我检查了“相机”和“麦克风”功能是否已启用。

当设置“无”状态时(在“加载”状态之后),我的控件在“实时可视树”上可见,除了 CameraView... 在此处输入图像描述

在安卓上

我检查了 Android Manifest 上是否启用了“RecordAudio”和“Camera”权限。

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />

我使用安卓模拟器。

同样的行为......但是!当我将 CameraView 移动到 Grid 时,相机会流式传输并显示出来!

其他信息

2021 年 6 月 9 日更新

我删除了状态管理。我还尝试使用 Visual State Manager(在 Xamarin.Forms API 中提供):

<Grid...>
<xct:CameraView
    x:Name="cameraView"
    CaptureMode="Photo"
    FlashMode="Off"
    HorizontalOptions="FillAndExpand"
    MediaCaptured="MediaCaptured"
    OnAvailable="CameraView_OnAvailable"
    VerticalOptions="FillAndExpand"/>
<VisualStateManager.VisualStateGroups>
    <VisualStateGroup Name="FooStates">
        <VisualState Name="State0">
            <VisualState.Setters>
                <Setter Property="IsVisible" Value="False"/>
            </VisualState.Setters>
        </VisualState>
        <VisualState Name="State1">
            <VisualState.Setters>
                <Setter Property="IsVisible" Value="True"/>
            </VisualState.Setters>
        </VisualState>
        <VisualState Name="State2">
            <VisualState.Setters>
                <Setter Property="IsVisible" Value="False"/>
            </VisualState.Setters>
        </VisualState>
    </VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</xct:CameraView>
</Grid>

最后,完全远程管理状态:

<Grid....>
<xct:CameraView
    x:Name="cameraView"
    CaptureMode="Photo"
    FlashMode="Off"
    HorizontalOptions="FillAndExpand"
    MediaCaptured="RecognitionCameraView_MediaCaptured"
    OnAvailable="RecognitionCameraView_OnAvailable"
    VerticalOptions="FillAndExpand"
    IsVisible="{Binding CameraIsVisible}"/>
</Grid>

结果是一样的...该页面在Windows上不显示相机流...

Xamarin 社区工具包示例

我尝试了 Xamarin Community Tollkit 示例应用程序,CameraView 工作正常。我什至尝试从示例中复制 XAML...该页面未在 Windows 上显示相机流...

解决方法

最后,我无法使用CameraView控件(来自Xamarin.Community.Toolkit包)在 Windows 上流式传输相机......

我选择了一个基本的替代解决方案:自定义渲染器

我受到 Xamarin 官方文档和他的示例的启发。该代码可在此处获得:

标签: c#xamlxamarin.formscameraxamarin-community-toolkit

解决方案


推荐阅读