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);
}
}
감사합니다. 그렇습니다. 다 끝났습니다. 내 프로젝트에서 붙여 넣은 위의 샘플 코드에 배치했습니다. :-) 가능한 문제가 계속 오게하십시오! 잘못된 스레드에서 수행중인 작업이있는 것처럼 느껴지지만 실제로 찾을 수 없습니다. 이전에 Device.BeginInvokeOnMainThread가 여러 곳에서 호출되었지만 나에게는 아무런 영향이 없었습니다. –
그래서 나는 돌아가서이 일을했습니다. 이 OnScanResult 메소드에서 일부 처리 작업을하려고하면 UI가 충돌합니다. Android에서 구성 요소가 충돌하게되는 현상이 발생합니다. 다시 돌아가서 MessageCenter를 통해 메시징을 구현하여 처리를 시작했는데 문제가 의도 한대로 작동하는 것 같습니다. 나는 IM에서 어제 Redth에게 조금 이야기했지만, 그는 vacay에있다. 그가 돌아올 때 그가 무엇인가를 안다면 나는 볼 것이다. 그때까지는 지금 일하고있는 것 같습니다. –
당신의 생각에 감사드립니다 @ Alessandro. 그들은 정말로 도움이됩니다. :-) –