终于,Xamarin 有了摄像头控件!





0/5 (0投票)
无需了解原生摄像头 API,即可快速利用移动设备上的摄像头。
引言
LEADTOOLS 摄像头控件 是 LEADTOOLS SDK for Xamarin 的最新产品。它解决了 Xamarin Forms 社区对一个高级控件的迫切需求,开发者可以利用它轻松调用移动设备摄像头。使用 LEADTOOLS 摄像头控件无需了解 iOS 和 Android 的原生摄像头 API,因为 LEADTOOLS 会为您处理所有这些。LEADTOOLS 摄像头控件提供对摄像头的完全控制,包括闪光灯、对焦、分辨率等。
设置您的项目
第一步是访问 https://www.leadtools.com/downloads/nuget 注册,以获取免费的 30 天试用许可证。
创建新项目
获得 LEADTOOLS 许可证后,打开 Visual Studio 2017 并创建一个新项目。在 Visual C# 选项卡中,选择“跨平台”>“移动应用 (Xamarin Forms)”。在下一页上,选择“空白”,然后为“平台”勾选 Android 和 iOS,并为“代码共享策略”选择“共享项目”。这将为您提供 Xamarin.Forms 应用程序的起始模板。
要开始使用 Leadtools.Camera.Xamarin,您必须添加对相应 NuGet 包的引用。要修改整个解决方案的 NuGet 包,请在 Visual Studio 中右键单击解决方案,然后选择“管理解决方案的 NuGet 程序包”。
您需要安装的 NuGet 包是:
- Leadtools.Camera.Xamarin
- Leadtools.Barcode
设置访问设备摄像头的权限
还有一件事很重要,那就是更新权限设置以请求访问摄像头。为此,请打开位于 XamarinCameraProject.Android
项目的 Properties 文件夹中的 AndroidManifest.xml 文件,并在 manifest 元素内(而不是 application 元素内)添加以下行:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
</manifest>
现在打开 MainActivity.cs,并用以下代码替换 OnCreate
函数:
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
RequestCameraPermission();
Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
}
private void RequestCameraPermission()
{
const int requestPermissionCode = 0;
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.Camera) != Permission.Denied &&
ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadExternalStorage) != Permission.Denied &&
ContextCompat.CheckSelfPermission(this, Manifest.Permission.WriteExternalStorage) !=
Permission.Denied) return;
ActivityCompat.RequestPermissions(this, new[]
{
Manifest.Permission.Camera, Manifest.Permission.ReadExternalStorage, Manifest.Permission.WriteExternalStorage
}, requestPermissionCode);
}
对于 iOS,请在 XML 编辑器中打开 Info.plist 文件(Visual Studio 的默认 GUI 似乎不支持这一点),并在 dict 元素内添加以下行:
<key>NSCameraUsageDescription</key>
<string>This app needs access to the camera to take photos.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>This app needs access to photos.</string>
</dict>
现在,在 iOS 项目中打开 AppDelegate.cs 文件,并用以下代码替换 FinishedLaunching
函数:
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
Leadtools.Camera.Xamarin.iOS.Assembly.Use();
global::Xamarin.Forms.Forms.Init();
LoadApplication(new App());
return base.FinishedLaunching(app, options);
}
代码
LEADTOOLS 摄像头控件是一个 Xamarin.Forms 控件,用于显示实时摄像头预览。设置它只需要两行代码。打开 MainPage.xaml 并将以下引用添加到 Leadtools.Camera.Xamarin
程序集:
xmlns:leadtools="clr-namespace:Leadtools.Camera.Xamarin;assembly=Leadtools.Camera.Xamarin"
现在,将 StackLayout 中的默认自动生成的标签替换为 Xamarin CameraView,以及一个将用于拍照的按钮。
<StackLayout>
<leadtools:CameraView x:Name="leadCamera"
CameraOptions="Rear"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand"/>
<Button HorizontalOptions="FillAndExpand"
Text="Snap Picture"
Clicked="SnapClicked" />
</StackLayout>
接下来,打开 MainPage.xaml.cs,并在 InitializeComponent()
之前添加以下行,以设置您之前收到的 LEADTOOLS 许可证,并初始化 LEADTOOLS 摄像头控件所需的程序集。您必须设置您的许可证,否则应用程序将在运行时抛出异常。
#if __IOS__
Leadtools.Converters.Assembly.Use();
#endif
Leadtools.Core.Assembly.Use();
Leadtools.Svg.Assembly.Use();
Leadtools.Camera.Xamarin.Assembly.Use();
Leadtools.Platform.RuntimePlatform = Device.RuntimePlatform;
Leadtools.RasterSupport.Initialize(this);
const string licString = "[License]\n" + "License = <doc><ver>2.0</ver>`PASTE YOUR LICENSE CONTENTS HERE`</doc>";
const string developerKey = "PASTE YOUR DEVELOPER KEY HERE";
var licBytes = System.Text.Encoding.UTF8.GetBytes(licString);
Leadtools.RasterSupport.SetLicense(licBytes, developerKey);
InitializeComponent();
}
现在应用程序的基础已经搭建好,添加代码以读取使用摄像头控件拍摄的图像的条形码。在 CameraView
类中,有一个名为 PictureReceived
的事件,当调用 ICamera.TakePicture()
捕获图像时会触发该事件。调用 TakePicture
方法将放在按钮点击事件中。
void SnapClicked(object sender, EventArgs args)
{
leadCamera.Camera.TakePicture();
}
要创建 PictureReceived
的事件处理程序,请在 InitializeComponent()
之后添加以下代码行:
leadCamera.CameraOptions.AutoRotateImage = true;
leadCamera.PictureReceived += LeadCamera_PictureReceived;
每次 PictureReceived
触发时,它都会调用 LeadCamera_PictureReceived
,该函数传递 FrameHandlerEventArgs
。 FrameHandlerEventArgs
有三个属性:
- Data,捕获的图像数据
- Image,与捕获操作关联的 RasterImage
- RotationDegree,将帧旋转到纵向所需的旋转度数
在此项目中,我们使用 Image 属性获取捕获的图像,然后从中读取和提取条形码数据。让我们创建一个另一个函数,它将接收图像并读取找到的任何条形码。该函数现在应该如下所示:
private void LeadCamera_PictureReceived(FrameHandlerEventArgs e)
{
ReadBarcode(e.Image);
}
接下来,向新的 ReadBarcodes
函数添加代码,该函数接收一个 RasterImage。LEADTOOLS 是市场上最全面的条形码工具包,可以检测和解码位图和彩色图像中的 100 多种一维和二维条形码类型。
public void ReadBarcode(RasterImage image)
{
try
{
var reader = new BarcodeEngine().Reader;
var dataArray = reader.ReadBarcodes(image, LeadRect.Empty, 0, null);
if (dataArray == null)
{
Device.BeginInvokeOnMainThread(() =>
{
DisplayAlert("Alert", "No barcodes were found", "OK");
});
return;
}
var sb = new StringBuilder();
sb.AppendLine($"{dataArray.Length} barcode(s) found");
sb.AppendLine();
foreach (var data in dataArray)
{
sb.AppendLine($@"
Symbology: {data.Symbology}
Location: {data.Bounds.ToString()}
Data: {data.Value}");
}
Device.BeginInvokeOnMainThread(() =>
{
DisplayAlert("Found Barcode(s)", sb.ToString(), "OK");
});
}
catch (Exception ex)
{
Device.BeginInvokeOnMainThread(() =>
{
DisplayAlert("Alert", ex.ToString(), "OK");
});
}
}
就是这样!现在在您的设备上构建并运行应用程序,然后读取一些条形码!
Leadtools.Camera.Xamarin
为 Xamarin 开发者提供了一个强大的高级 API,可以访问和控制移动摄像头硬件,而无需了解与每个原生 API 相关的各种细节。
需要帮助才能开始使用此示例?通过电子邮件或聊天联系我们的支持团队,享受免费技术支持!