2017-10-07 6 views
0

Xamarin.FormsでQRコードを読み取ろうとしています。私はXFで共有プロジェクトを持っています。 ZXing.Net用のナゲットパッケージを追加しました。すべてがiOSプロジェクトで機能します。 Androidプロジェクトでエラーが発生しています。 Android SDK Monitorを介して取得したエラーは、スキャナがヌルでアクセス不能であるという問題があることを示します。私は、Android側で正しく設定していないことがあると推測しています。誰かが私のコードで何かが不適切だと思っていますか?御時間ありがとうございます。スキャナがnullで、アクセスできない

ScanPage class: 
public class ScanPage : ContentPage 
{ 
    ZXing.Net.Mobile.Forms.ZXingScannerView zxing; 
    ZXingDefaultOverlay overlay; 
    bool isConnected = false; 
    string basicUrl = "golfeventscores.azurewebsites.net"; 
    public ScanPage() 
    { 

     zxing = new ZXing.Net.Mobile.Forms.ZXingScannerView 
     { 
      HorizontalOptions = LayoutOptions.FillAndExpand, 
      VerticalOptions = LayoutOptions.FillAndExpand, 
      AutomationId = "zxingScannerView", 
     }; 
     zxing.OnScanResult += async (ZXing.Result result) => { 
      zxing.IsAnalyzing = false; 
      zxing.IsScanning = false; 
      var teamToken = result.Text; 
      //MessagingCenter.Send<string>(teamToken, "SelectTeamMembers"); 
      isConnected = await Plugin.Connectivity.CrossConnectivity.Current.IsRemoteReachable(basicUrl); 
      if (isConnected) 
      { 
       await GetTeamData(teamToken); 
      } 
      else 
      { 
       await DisplayAlert("Connectivity", "There is a problem with internet connectivity. Please try and reload this screen.", "Ok"); 
      } 
     }; 

     overlay = new ZXingDefaultOverlay 
     { 
      TopText = "Hold your phone up to the barcode", 
      BottomText = "Scanning will happen automatically", 
      ShowFlashButton = zxing.HasTorch, 
      AutomationId = "zxingDefaultOverlay", 
     }; 
     overlay.FlashButtonClicked += (sender, e) => { 
      zxing.IsTorchOn = !zxing.IsTorchOn; 
     }; 
     var grid = new Grid 
     { 
      VerticalOptions = LayoutOptions.FillAndExpand, 
      HorizontalOptions = LayoutOptions.FillAndExpand, 
     }; 
     grid.Children.Add(zxing); 
     grid.Children.Add(overlay); 

     // The root page of your application 
     Content = grid; 
    } 

    protected override void OnAppearing() 
    { 
     base.OnAppearing(); 
     zxing.IsScanning = true; 
    } 

    protected override void OnDisappearing() 
    { 
     zxing.IsScanning = false; 
     base.OnDisappearing(); 
    } 
    async System.Threading.Tasks.Task GetTeamData(string Token) 
    { 
     try 
     { 
      var scanResult = await WebServices.ws.TokenLookup(Token); 
      if (scanResult.Result == true) 
      { 
       if (scanResult.IsScoreBoard == true) 
       { 
        var uri = new System.Uri(scanResult.ScoreboardUrl); 
        Device.BeginInvokeOnMainThread(() => 
        { 
         Device.OpenUri(uri); 
         Navigation.PopToRootAsync(); 
        }); 
       } 
       if (scanResult.IsCharity == true) 
       { 
        if (scanResult.TeamPlayers.Count > 0) 
        { 
         var player = scanResult.TeamPlayers.First(); 
         var playerId = player.PlayerTeamId; 
         var urlResult = await WebServices.ws.ServerUrl(Token, playerId); 

         if (urlResult.ValidRequest && (!String.IsNullOrEmpty(urlResult.Url))) 
         { 
          var uri = new System.Uri(urlResult.Url); 
          Device.OpenUri(uri); 
          await Navigation.PopToRootAsync(); 
         } 
        } 
        else{ 
         await DisplayAlert("Scanning", "There was a problem downloading the Charity Team Info.", "OK"); 
        } 
       } 
       else 
       { 
        if (scanResult.IsLargeGame != true) 
        { 
         var select = new Pages.SelectTeamMembers(Token); 
         await Navigation.PushAsync(select); 
        } 
        else 
        { 
         await DisplayAlert("Large Game", "Don't have the large team game setup with scanning.", "Ok"); 
        } 
       } 
      } 
      else 
      { 
       await DisplayAlert("Server Problem", "There was some type of server error. Please try again or call Wally.", "Ok"); 
      } 
     } 
     catch(System.Exception sysExc) 
     { 
      //nothing seems to be caught 
     } 
    } 
} 

MainActivity.cs contents: 
[Activity (Label = "TD Scan", Icon = "@drawable/icon", Theme="@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)] 
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity 
{ 
    protected override void OnCreate (Bundle bundle) 
    { 
     TabLayoutResource = Resource.Layout.Tabbar; 
     ToolbarResource = Resource.Layout.Toolbar; 

     base.OnCreate (bundle); 
     global::Xamarin.Forms.Forms.Init (this, bundle); 
     ZXing.Net.Mobile.Forms.Android.Platform.Init(); 
     LoadApplication (new GolfGameScanApp.App()); 
    } 

    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults) 
    { 
     ZXing.Net.Mobile.Android.PermissionsHandler.OnRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 

答えて

0

Androidプロジェクトですべて定義しましたか?

Xamarinは、必要に応じて、もう少しセットアップがあるXamarinフォームについて

フォーム。プラットフォーム固有のアプリケーションプロジェクト内の各プラットフォームでライブラリを初期化する必要があります。

アンドロイド

Androidでは、あなたの主な活動のOnCreate関数(..)の実装では、呼び出し:Xamarin.Formsため

ZXing.Net.Mobile.Forms.Android.Platform.Init(); 

ZXing.Net.Mobileものための新しいAndroidの許可要求モデルを扱いますあなたのメインアクティビティに次のオーバーライド実装を追加する必要があります:

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults) 
{ 
    global::ZXing.Net.Mobile.Forms.Android.PermissionsHandler.OnRequestPermissionsResult (requestCode, permissions, grantResults);   
} 

カメラの権限が自動的に含まれている必要がありますAndroidManifest.xmlの中であなたのためにTorch APIを使用したいのであれば、懐中電灯のアクセス権を自分で追加する必要があります。これを行うには、次のアセンブリレベル属性を使用します。

[assembly: UsesPermission (Android.Manifest.Permission.Flashlight)] 
+0

ありがとうございました。はい、そのすべてが完了しました。私は上のサンプルコードで、私は自分のプロジェクトに貼り付けました。 :-)起こり得る問題を控えてください! 間違ったスレッドで何かしている可能性もありますが、それを見つけることはできません。私は以前、Device.BeginInvokeOnMainThreadの束をどこにでも持っていましたが、それは私のために何もしませんでした。 –

+0

だから私は戻ってこれに取り組んだ。このOnScanResultメソッドでいくつかの処理作業を実行しようとすると、コンポーネントをクラッシュさせる何かがUI上で発生します。私は戻って、処理を開始するためにMessageCenter経由でいくつかのメッセージングを実装しました。これは、意図したとおりに動作するように思えます。私は昨日IMでRedthに少し話しましたが、彼は休暇中です。彼が戻ってくるときに何かを知っているかどうかわかります。それまでは、私は今働いているようです。 –

+0

あなたの考えてくれてありがとう@Alessandro。彼らは本当に助けます。 :-) –

関連する問題