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

MAUI Blazor自定义相机开发:Android平台XAML命名空间问题咨询

解决MAUI中自定义Android相机的XAML实现问题

你不能直接在MAUI XAML中使用Android原生的android:属性,MAUI有自己跨平台的控件体系和属性规则,这就是你看到红色报错的原因。以下是正确的实现方案:

一、核心原理说明

MAUI的XAML是跨平台抽象层,不支持直接引用Android原生布局属性。要实现自定义相机,需要:

  • 使用MAUI标准控件构建跨平台UI框架
  • 针对Android平台,通过平台特定代码嵌入原生相机组件(如TextureView)并实现相机控制逻辑
  • 通过MAUI的依赖注入或平台服务关联C#代码

二、正确的MAUI XAML结构

先构建基础的跨平台布局,对应你原Android布局的结构:

<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="AndroidCamera.Pages.Camera1">
    <ContentPage.Content>
        <VerticalStackLayout 
            HorizontalOptions="Fill"
            VerticalOptions="Fill">
            <!-- 占位容器,用于嵌入Android原生TextureView -->
            <ContentView x:Name="CameraPreviewContainer"
                         WidthRequest="MatchParent"
                         HeightRequest="MatchParent"/>
            
            <Button x:Name="CaptureButton"
                    Text="拍照"
                    WidthRequest="WrapContent"
                    HeightRequest="WrapContent"
                    Margin="10"/>
            
            <ImageButton x:Name="CameraSwitchButton"
                         Source="camera_icon.png"
                         WidthRequest="WrapContent"
                         HeightRequest="WrapContent"
                         Margin="10"/>
        </VerticalStackLayout>
    </ContentPage.Content>
</ContentPage>
  • 用VerticalStackLayout替代Android的LinearLayout(vertical)
  • 用x:Name替代android:id(用于C#代码绑定)
  • 用WidthRequest/HeightRequest替代android:layout_width/layout_height
  • 用ContentView作为容器,后续在Android平台代码中嵌入原生TextureView

三、Android平台相机实现步骤

1. 在Android项目中添加相机权限

修改Platforms/Android/AndroidManifest.xml,添加:

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

2. 编写Android平台特定的相机控制代码

在Platforms/Android下创建CameraService.cs:

using Android.Content;
using Android.Hardware.Camera2;
using Android.Views;
using Microsoft.Maui.Controls.Platform;

namespace AndroidCamera.Platforms.Android;

public class CameraService
{
    private TextureView _textureView;
    private CameraDevice _cameraDevice;
    private readonly Context _context;
    private readonly ViewGroup _container;

    public CameraService(Context context, ViewGroup container)
    {
        _context = context;
        _container = container;
        InitializeTextureView();
    }

    private void InitializeTextureView()
    {
        _textureView = new TextureView(_context);
        _textureView.LayoutParameters = new ViewGroup.LayoutParams(
            ViewGroup.LayoutParams.MatchParent,
            ViewGroup.LayoutParams.MatchParent);
        _container.AddView(_textureView);
        
        _textureView.SurfaceTextureListener = new TextureListener(this);
    }

    // 打开相机逻辑(简化示例)
    public void OpenCamera()
    {
        var manager = (CameraManager)_context.GetSystemService(Context.CameraService);
        var cameraId = manager.GetCameraIdList()[0]; // 默认后置相机
        manager.OpenCamera(cameraId, new CameraStateCallback(this), null);
    }

    // 相机状态回调等逻辑自行补充
    private class CameraStateCallback : CameraDevice.StateCallback
    {
        private readonly CameraService _service;
        public CameraStateCallback(CameraService service) => _service = service;

        public override void OnOpened(CameraDevice camera)
        {
            _service._cameraDevice = camera;
            // 后续配置预览请求等
        }

        public override void OnDisconnected(CameraDevice camera) => camera.Close();
        public override void OnError(CameraDevice camera, CameraError error) => camera.Close();
    }

    private class TextureListener : Java.Lang.Object, TextureView.ISurfaceTextureListener
    {
        private readonly CameraService _service;
        public TextureListener(CameraService service) => _service = service;

        public void OnSurfaceTextureAvailable(SurfaceTexture surface, int width, int height)
        {
            _service.OpenCamera();
        }

        public bool OnSurfaceTextureDestroyed(SurfaceTexture surface)
        {
            _service._cameraDevice?.Close();
            return true;
        }

        public void OnSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {}
        public void OnSurfaceTextureUpdated(SurfaceTexture surface) {}
    }
}

3. 在MAUI页面中关联平台代码

修改Camera1.xaml.cs,在页面加载时初始化Android相机:

using Android.Views;
using AndroidCamera.Platforms.Android;
using Microsoft.Maui.Platform;

namespace AndroidCamera.Pages;

public partial class Camera1 : ContentPage
{
    public Camera1()
    {
        InitializeComponent();
    }

    protected override void OnAppearing()
    {
        base.OnAppearing();
        // 仅在Android平台执行
#if ANDROID
        var nativeContainer = CameraPreviewContainer.ToPlatform(this) as ViewGroup;
        var cameraService = new CameraService(Microsoft.Maui.ApplicationModel.Platform.CurrentActivity, nativeContainer);
#endif
    }
}

四、关键注意事项

  • 相机权限申请:需要在运行时动态申请相机权限,可使用MAUI的Permissions.Camera API
  • iOS平台需要单独实现:同样的逻辑,在iOS平台用AVCaptureSession和PreviewLayer实现
  • Blazor页面集成:如果是MAUI Blazor项目,可以通过ComponentBase调用平台服务,或者用@inject获取依赖服务

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:05:22