You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.NET MAUI安卓端自定义拍照窗口实现拍照功能

.NET MAUI 安卓端自定义相机窗口拍照实现方案

依赖包选择与配置

不需要使用Xamarin时期的Xam.Plugin.Media包,该包已停止维护,MAUI环境下兼容性较差。
要实现自定义相机窗口(不调用系统相机应用),推荐使用.NET MAUI官方维护的社区工具包相机组件CommunityToolkit.Maui.Camera,完全支持自定义UI布局,所有相机操作都在当前应用窗口内完成。
配置步骤:

  • 在NuGet包管理器中搜索安装CommunityToolkit.Maui和CommunityToolkit.Maui.Camera的最新稳定版
  • 在MauiProgram.cs中注册相机服务:
var builder = MauiApp.CreateBuilder();
builder
    .UseMauiApp<App>()
    .UseMauiCommunityToolkit()
    .UseMauiCommunityToolkitCamera() // 注册相机组件服务
    .ConfigureFonts(fonts =>
    {
        fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
    });

安卓权限配置

在Platforms/Android/AndroidManifest.xml中添加相机相关权限声明:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" android:required="true" />

自定义拍照页面实现

你可以完全自主设计页面布局,仅用CameraView组件渲染相机预览流,自定义拍照按钮的样式、位置:

XAML布局示例

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
             x:Class="你的项目命名空间.CustomCameraPage">
    <Grid>
        <!-- 相机预览层,占满全屏 -->
        <toolkit:CameraView x:Name="MainCameraView" 
                            CameraPosition="Rear"
                            HorizontalOptions="FillAndExpand"
                            VerticalOptions="FillAndExpand"/>
        <!-- 自定义底部拍照按钮区域,可任意修改样式、添加其他功能按钮 -->
        <StackLayout VerticalOptions="End" 
                     HorizontalOptions="Center"
                     Margin="0,0,0,30">
            <Button x:Name="TakePhotoBtn"
                    Text="拍照"
                    BackgroundColor="White"
                    TextColor="Black"
                    WidthRequest="80"
                    HeightRequest="80"
                    CornerRadius="40"
                    Clicked="TakePhotoBtn_Clicked"/>
        </StackLayout>
    </Grid>
</ContentPage>

拍照逻辑实现

private async void TakePhotoBtn_Clicked(object sender, EventArgs e)
{
    // 动态申请相机权限
    var cameraPermission = await Permissions.CheckStatusAsync<Permissions.Camera>();
    if (cameraPermission != PermissionStatus.Granted)
    {
        cameraPermission = await Permissions.RequestAsync<Permissions.Camera>();
        if (cameraPermission != PermissionStatus.Granted)
        {
            await DisplayAlert("提示", "请先授予相机权限", "确定");
            return;
        }
    }

    // 捕获当前预览帧作为照片
    var capturedPhoto = await MainCameraView.CaptureImageAsync();
    if (capturedPhoto != null)
    {
        // 自行处理拍摄到的照片:比如保存到本地、上传、展示等
        // 示例:转为字节数组存储
        using var stream = await capturedPhoto.OpenReadAsync();
        using var ms = new MemoryStream();
        await stream.CopyToAsync(ms);
        var photoBytes = ms.ToArray();

        // 拍摄完成后可自定义后续操作,比如关闭当前页面
        await Navigation.PopAsync();
    }
}

如果需要更高度的自定义能力,比如调整对焦、曝光、添加实时滤镜等,可以直接在安卓平台调用原生Camera2 API嵌入MAUI的ContentView中实现。

内容的提问来源于stack exchange,提问作者Jeffrey Chen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:27:03