原生嵌入.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,版本建议使用最新稳定版。
验证步骤
- 清理并重新编译项目
- 部署应用到测试设备/模拟器
- 首次启动时允许相机权限请求
- 检查相机视图是否正常显示
内容的提问来源于stack exchange,提问作者Nantha Kishor Anandhan
相关产品推荐
相关产品推荐

