扫描仪为空且无法访问

时间:2017-10-07 01:14:06

标签: xamarin xamarin.forms zxing zxing.net

我正在尝试在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);
    }
}

1 个答案:

答案 0 :(得分:0)

您是否在Android项目中定义了所有内容?

Xamarin表格

对于Xamarin Forms,需要更多设置。您需要在特定于平台的应用程序项目中的每个平台上初始化库。

的Android

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

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

ZXing.Net.Mobile for Xamarin.Forms还为您处理新的Android权限请求模型,但您还需要将以下覆盖实现添加到主Activity:

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)]