2017-10-07 1 views
0

Xamarin.Forms에서 QRCode를 읽으려고합니다. XF에서 공유 프로젝트가 있습니다. ZXing.Net 용 너겟 패키지를 추가했습니다. 모든 것이 iOS 프로젝트에서 작동합니다. Android 프로젝트에서 오류가 발생했습니다. Android SDK Monitor를 통해 얻은 오류는 스캐너가 null이며 액세스 할 수 없다는 문제가 있음을 나타냅니다. 나는 안드로이드 측면에서 내가 올바르게 설정하지 않은 것이 있다는 것을 짐작하고있다. 아무도 내 코드에서 부적절한 것을 본 적이 있습니까? 시간 내 줘서 고마워.스캐너가 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 프로젝트에 모두 정의하셨습니까?

자 마린 필요 조금 더 설정이 자 마린 양식을 위해

을 형성한다. 플랫폼 별 앱 프로젝트에서 각 플랫폼의 라이브러리를 초기화해야합니다.

안드로이드

안드로이드에서 기본 활동의 한 OnCreate (..) 구현, 전화 : Xamarin.Forms에 대한

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

ZXing.Net.Mobile도에 대한 새로운 안드로이드 권한 요청 모델을 처리 하지만 다음과 같은 재정의 구현을 기본 활동에 추가해야합니다.

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가 충돌합니다. Android에서 구성 요소가 충돌하게되는 현상이 발생합니다. 다시 돌아가서 MessageCenter를 통해 메시징을 구현하여 처리를 시작했는데 문제가 의도 한대로 작동하는 것 같습니다. 나는 IM에서 어제 Redth에게 조금 이야기했지만, 그는 vacay에있다. 그가 돌아올 때 그가 무엇인가를 안다면 나는 볼 것이다. 그때까지는 지금 일하고있는 것 같습니다. –

+0

당신의 생각에 감사드립니다 @ Alessandro. 그들은 정말로 도움이됩니다. :-) –

관련 문제