如何在.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
相关产品推荐
相关产品推荐

