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

原生嵌入.NET MAUI项目中ZXing.Net.Maui相机不显示求助

问题描述

从零创建了一个由Xamarin.Android转换而来的简单.NET MAUI项目(目标框架为net8.0-android),仅包含四个文件。尝试集成ZXing.Net.Maui时,运行应用后相机无法显示,但将CameraBarcodeReaderView替换为简单Label时可正常显示。已在AndroidManifest.xml中添加相机权限,但无效果。

相关代码

MainActivity.cs

using Microsoft.Maui.Embedding;
using Microsoft.Maui.Platform;
using ZXing.Net.Maui.Controls;

namespace ZXingMauiNativeEmbedding.Droid
{
    [Activity(Label = "@string/app_name", MainLauncher = true, Theme = "@style/Theme.MaterialComponents.Light.DarkActionBar")]
    public class MainActivity : Activity
    {
        MauiContext mauiContext;
        protected override void OnCreate(Bundle? savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            var builder = MauiApp.CreateBuilder();
            builder.UseMauiEmbedding<Microsoft.Maui.Controls.Application>().UseBarcodeReader();
            var mauiApp = builder.Build();
            mauiContext = new MauiContext(mauiApp.Services, this);
            var myMauiPage = new MainPage();
            var containerView = myMauiPage.ToContainerView(mauiContext);
            SetContentView(containerView);
        }
    }

MainPage.xaml

<?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"
             xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;assembly=ZXing.Net.MAUI.Controls"
             x:Class="ZXingMauiNativeEmbedding.Droid.MainPage">
    <ScrollView>
        <VerticalStackLayout Padding="30,0" Spacing="25" VerticalOptions="Center">
            <zxing:CameraBarcodeReaderView x:Name="barcodeReader" BarcodesDetected="BarcodesDetected" />
        </VerticalStackLayout>
    </ScrollView>
</ContentPage>

MainPage.xaml.cs

using ZXing.Net.Maui;

namespace ZXingMauiNativeEmbedding.Droid
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            barcodeReader.Options = new BarcodeReaderOptions
            {
                Formats = BarcodeFormats.All,
                AutoRotate = true,
                Multiple = false
            };
            barcodeReader.CameraLocation = CameraLocation.Front;
        }

        public void BarcodesDetected(object sender, BarcodeDetectionEventArgs e)
        {
            var first = e.Results?.FirstOrDefault();
            if (first is null)
                return;

            Dispatcher.DispatchAsync(async () =>
            {
                await DisplayAlert("Barcode Detected", first.Value, "OK");
            });
        }
    }
}

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true">
  </application>
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.CAMERA" />
</manifest>  
解决方案

1. 动态请求相机权限

Android 6.0(API 23)及以上要求动态申请危险权限,仅在Manifest中声明无法让应用获取权限。修改MainActivity.cs,添加权限请求逻辑:

using Microsoft.Maui.Embedding;
using Microsoft.Maui.Platform;
using ZXing.Net.Maui.Controls;
using AndroidX.Core.App;
using AndroidX.Core.Content;
using Android.Widget;

namespace ZXingMauiNativeEmbedding.Droid
{
    [Activity(Label = "@string/app_name", MainLauncher = true, Theme = "@style/Theme.MaterialComponents.Light.DarkActionBar")]
    public class MainActivity : Activity
    {
        MauiContext mauiContext;
        protected override void OnCreate(Bundle? savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            RequestCameraPermissions();
        }

        private void RequestCameraPermissions()
        {
            const string cameraPermission = Android.Manifest.Permission.Camera;
            if (ContextCompat.CheckSelfPermission(this, cameraPermission) != Android.Content.PM.Permission.Granted)
            {
                ActivityCompat.RequestPermissions(this, new[] { cameraPermission }, 100);
                return;
            }
            InitializeMauiAndZxing();
        }

        private void InitializeMauiAndZxing()
        {
            var builder = MauiApp.CreateBuilder();
            builder.UseMauiEmbedding<Microsoft.Maui.Controls.Application>().UseBarcodeReader();
            var mauiApp = builder.Build();
            mauiContext = new MauiContext(mauiApp.Services, this);
            var myMauiPage = new MainPage();
            var containerView = myMauiPage.ToContainerView(mauiContext);
            SetContentView(containerView);
        }

        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults)
        {
            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
            if (requestCode == 100)
            {
                if (grantResults.Length > 0 && grantResults[0] == Android.Content.PM.Permission.Granted)
                {
                    InitializeMauiAndZxing();
                }
                else
                {
                    Toast.MakeText(this, "相机权限被拒绝,无法使用扫码功能", ToastLength.Long).Show();
                }
            }
        }
    }
}

2. 补充相机硬件特性声明

在AndroidManifest.xml中添加相机硬件特性声明,帮助系统识别应用对相机的依赖:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true">
  </application>
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.CAMERA" />
  <!-- 添加相机特性声明 -->
  <uses-feature android:name="android.hardware.camera" android:required="true" />
  <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
</manifest>  

3. 修正CameraBarcodeReaderView布局约束

当前布局中CameraBarcodeReaderView未设置明确宽高,可能导致视图不可见。修改MainPage.xaml,添加布局约束:

<zxing:CameraBarcodeReaderView 
    x:Name="barcodeReader" 
    BarcodesDetected="BarcodesDetected"
    HorizontalOptions="FillAndExpand"
    VerticalOptions="FillAndExpand" />

或者设置固定尺寸:

<zxing:CameraBarcodeReaderView 
    x:Name="barcodeReader" 
    BarcodesDetected="BarcodesDetected"
    WidthRequest="300"
    HeightRequest="300"
    HorizontalOptions="Center" />

4. 确认NuGet包版本适配

确保已安装适配.NET 8的ZXing.Net.Maui相关NuGet包:ZXing.Net.MAUI和ZXing.Net.MAUI.Controls,版本建议使用最新稳定版。

验证步骤
  1. 清理并重新编译项目
  2. 部署应用到测试设备/模拟器
  3. 首次启动时允许相机权限请求
  4. 检查相机视图是否正常显示

内容的提问来源于stack exchange,提问作者Nantha Kishor Anandhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:45:07