2017-10-07 108 views
0

我试图读取Xamarin.Forms中的QRCode。我在XF有一个共享的项目。我为ZXing.Net添加了nuget包。一切工作在iOS项目中。我在Android项目中遇到错误。我通过Android SDK Monitor获取的错误,表明扫描器为空并且无法访问时出现问题。我猜测,有些东西我没有在Android端设置正确。有人在我的代码中看到任何不正确的东西吗?谢谢你的时间。扫描仪为空且无法访问

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

在Android上,在您的主要活动的OnCreate(..)实现,调用:

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

ZXing.Net.Mobile为Xamarin.Forms还负责将新的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,你仍然需要自己添加Flashlight权限。您可以使用以下装配级别属性来执行此操作:

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

谢谢。是的,所有这些都已完成。我把它放在我粘贴出来的示例代码之上。 :-)请保留可能出现的问题! 它也觉得有可能是我在错误的线程上做的事情,但不能完全找到它。我以前有过一堆Device.BeginInvokeOnMainThread调用,但它对我没有任何帮助。 –

+0

所以,我回去工作了。它似乎是,如果你尝试在这个OnScanResult方法中做一些处理工作,那么点击用户界面,无论什么东西在Android上发生,导致组件崩溃。我回去并通过MessageCenter实施了一些消息传递以开始处理,并且这似乎导致事情按预期工作。我昨天在IM上与Redth谈了一点,但他现在处于空闲状态。当他回来时,我会看看他是否知道任何事情。在此之前,我似乎现在正在工作。 –

+0

感谢您的想法@Alessandro。他们真的帮助。 :-) –