如何在.NET MAUI中为Android打造二维码扫描应用
.NET MAUI是Xamarin的进化版,如果你已经用了Xamarin,那么可以尝试把工程移植到.NET MAUI。这篇文章分享下我的移植心得。
从Xamarin.Forms迁移到.NET MAUI
我之前用Xamarin.Forms写了一个适用于Android和iOS的一维码,二维码扫描程序:https://github.com/yushulx/xamarin-forms-barcode-qrcode-scanner。
微软官方在GitHub上发布了一个移植教程,但我觉得还是创建一个新的.NET MAUI比较好,这样可以避免一下子出现大量的编译错误。
创建.NET MAUI工程
要创建.NET MAUI工程,你需要安装Visual Studio 2022 Preview版本,稳定版不包含工程模板。
.NET MAUI工程创建之后,包含了Windows, macOS, Tizen, Android和iOS的代码和支持框架。为了简洁干净,删除不必要的平台,只保留Android和iOS。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net6.0-android;net6.0-ios</TargetFrameworks>
<OutputType>Exe</OutputType>
<RootNamespace>BarcodeQrScanner</RootNamespace>
<UseMaui>true</UseMaui>
<SingleProject>true</SingleProject>
</Project>
通过NuGet安装依赖库
我们需要用到两个重要的库,一个是SkiaSharp,另一个是Dynamsoft Barcode Reader。
SkiaSharp用于Xamarin.Forms和.NET MAUI的包名是不同的。使用Xamarin.Forms安装SkiaSharp.Views.Forms
,使用.NET MAUI安装SkiaSharp.Views.Maui.Controls
。
Dynamsoft Barcode Reader没有针对框架定制。
安装之后发现,Android可以用,而iOS会出现兼容性错误。
因此移植之后,Android上可以正常扫码,而iOS上只能打开摄像头。iOS上相关的扫码代码全部注释掉了,这部分可以用别的库替代,或者等待SDK发布更新。
代码
根据在线文档,要调用平台相关的代码需要用到partical class
和partial method
。
我们在公共代码里定义:
public partial class BarcodeQRCodeService
{
public partial void InitSDK(string license);
public partial BarcodeQrData[] DecodeFile(string filePath);
}
然后在Android和iOS的平台代码里去实现接口。
public class DBRLicenseVerificationListener : Java.Lang.Object, IDBRLicenseVerificationListener
{
public void DBRLicenseVerificationCallback(bool isSuccess, Java.Lang.Exception error)
{
if (!isSuccess)
{
System.Console.WriteLine(error.Message);
}
}
}
public partial class BarcodeQRCodeService
{
public partial void InitSDK(string license)
{
BarcodeReader.InitLicense(license, new DBRLicenseVerificationListener());
reader = new BarcodeReader();
}
public partial BarcodeQrData[] DecodeFile(string filePath)
{
BarcodeQrData[] output = null;
try
{
PublicRuntimeSettings settings = reader.RuntimeSettings;
settings.ExpectedBarcodesCount = 512;
reader.UpdateRuntimeSettings(settings);
TextResult[] results = reader.DecodeFile(filePath);
if (results != null && results.Lengt
下一篇: 二维码的的扫描