xamarin / UWPでQRコードを読み取るコードを実践してみました。
QRコードリーダーは有名なZXing(ゼブラクロッシング)と言うライブラリがあります。
このZxingがxamarinで使用できるようにしたZxing.Net.Mobileがあり、xamarinでも容易にQRコードを扱えます。
・・・と書きつつも私は容易に扱えませんでした。
Qiitaの記事を読むとNuGetからZxing.Net.Mobileを取得して容易に実行できるように書かれていたのですが・・・。
私が試した手順は以下です。
1. Blank Xaml App (Xamarin.Forms Portable)を選択する
2. インストールされているSDKに適したバージョンを選択する
3. 各プロジェクトのプロパティを開きターゲットを変更する
プロパティを開き、変更を選択する
以下のようにターゲットを変更する
4. Zxing.MobileをNuGetで追加する
5. TestZXingMobile.UWPのCapabilityにWebCameraを追加する
6. TestZXingMobile(移植可能)のApp.xaml.csを編集しMainPageをNavigationPageに変更する
public App()
{
InitializeComponent();
//MainPage = new TestZXingMobile.MainPage();
MainPage = new NavigationPage(new TestZXingMobile.MainPage());
}
7. TestZXingMobile(移植可能)のMainPageにボタンを追加します。
MainPage.xaml
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:TestZXingMobile"
x:Class="TestZXingMobile.MainPage">
<!-- ここを追加 -->
<Button Text="QRコードをスキャンする"
VerticalOptions="Center"
HorizontalOptions="Center"
Clicked="ScanButtonClicked"/>
</ContentPage>
MainPage.xaml.cs
//先頭に参照を追加
using ZXing.Net.Mobile.Forms;
//ボタンの応答処理を追加
async void ScanButtonClicked(object sender, EventArgs s)
{
// スキャナページの設定
var scanPage = new ZXingScannerPage()
{
DefaultOverlayTopText = "バーコードを読み取ります",
DefaultOverlayBottomText = "",
};
// スキャナページを表示
await Navigation.PushAsync(scanPage);
// データが取れると発火
scanPage.OnScanResult += (result) =>
{
// スキャン停止
scanPage.IsScanning = false;
// PopAsyncで元のページに戻り、結果をダイアログで表示
Device.BeginInvokeOnMainThread(async () =>
{
await Navigation.PopAsync();
await DisplayAlert("スキャン完了", result.Text, "OK");
});
};
}
8.TestZXingMobile.UWPのMainPage.xaml.csにZxing.Mobileの初期化コードを記載します。
public MainPage()
{
this.InitializeComponent();
//初期化処理を追加
ZXing.Net.Mobile.Forms.WindowsUniversal.ZXingScannerViewRenderer.Init();
LoadApplication(new QRReader.App());
}
9. TestZXingMobile.UWPのビルドと配置を行う。
10. 配置されたアプリを実行する
起動後、「QRコードをスキャンする」ボタンをタップすると、以下の例外が発生しクラッシュします。
例外がスローされました: 'System.IO.FileLoadException' (mscorlib.ni.dll の中)
・・・と、NuGetから取得したZxing.Net.Mobileで動作を確認できませんでした。
しかし、GitHubから入手したライブラリをコンパイルし組み込んだ場合は動作可能でした。
どうやら、UWPアプリを作成した時のSDKのバージョンに依存してしまうなどの問題があるようです。
0 件のコメント :
コメントを投稿