Мне нужна помощь, чтобы понять, почему возникает это исключение. Исключение составляют:
Android.Util.AndroidRuntimeException: Only the original thread that created a view hierarchy can touch its views.
Ссылка на hastebin с полным исключением
Я использую ZXing.Net.Mobile.Forms для сканирования штрих-кода и Rg.Plugins.Popup для отображения всплывающих окон. Я считаю, что один из них вызывает исключение.
Исключение создается случайным образом. Приложение работает нормально 99% времени.
ScannerPage.xaml
<zxing:ZXingScannerView x:Name = "ScannerView"
Result = "{Binding ScanResult, Mode=OneWayToSource}"
ScanResultCommand = "{Binding ScanResultCommand}"
IsScanning = "{Binding IsScanning}"
IsAnalyzing = "{Binding IsAnalyzing}" />
<zxing:ZXingDefaultOverlay x:Name = "ScannerOverlay"
BottomText = "Scanning will happen automatically"
ShowFlashButton = "False"/>
ScannerPageViewModel.cs (без ненужных частей)
[PropertyChanged.AddINotifyPropertyChangedInterface]
internal class ScannerPageViewModel : INavigatedAware
{
public ScannerPageViewModel(IScannerService scannerService, IUserDialogs dialogs, IPopupNavigation popups, IScreenService screen)
{
ScanResultCommand = new Command(ProcessBarcode);
}
public ICommand ScanResultCommand { get; }
/// <summary>
/// Show info dialog box with ticket info.
/// </summary>
private async Task ShowInfoScanResult(string message)
{
var popup = new PopupViews.InfoScanResult(Popups, message);
popup.Disappearing += (se, ev) => IsAnalyzing = true;
await Popups.PushAsync(popup);
}
private void ProcessBarcode()
{
Device.BeginInvokeOnMainThread(async () =>
{
if (ScanResult != null && !string.IsNullOrEmpty(ScanResult.Text))
{
// Disable the scanner after one barcode is found.
IsAnalyzing = false;
var source = new CancellationTokenSource();
// Show loading animation if scanning takes >1 second.
var t = Task.Run(async () =>
{
await Task.Delay(1000, source.Token);
Device.BeginInvokeOnMainThread(ShowLoading);
});
// Call the web service to process the barcode.
var scanResponse = await ScannerService.ScanBarcode(ScanResult.Text, ScanningSession, SelectedScanAction);
if (scanResponse.IsSuccessful)
{
var scanResult = scanResponse.Data;
if (scanResult.Success)
{
var json = scanResult.BarcodeInfo;
var message = ParseJsonBarcodeInfo(json);
if (SelectedScanAction == ScanAction.Information)
await ShowInfoScanResult(message);
else
await ShowOkScanResult(message);
}
else
{
await ShowErrorScanResult(scanResult.FaultDescription);
}
}
else
{
ShowScanRequestError(scanResponse.ErrorMessage);
}
source.Cancel(); // Cancel loading animation timer.
HideLoading();
Screen.SetFullscreen();
source.Dispose();
}
});
}
Да, я дал разрешения.
где вы дали разрешение
В свойствах проекта> манифест Android> необходимые разрешения. Он был добавлен в AndroidManifest.xml.
Просто попробуйте добавить в MainActivity разрешение, которое переопределяется - 2 3 4 public override void OnRequestPermissionsResult (int requestCode, string [] permissions, Permission [] grantResults) {global :: ZXing.Net.Mobile.Forms.Android.PermissionsHandler.On RequestPermissionsRe sult (requestCode, permissions, grantResults); }
Я уже добавил эти строки.





Я создал для меня службу зависимостей для Android, она отлично работает, проверьте приведенный ниже код.
Проект PCL
public interface IBarcodeScanner
{
Task<string> ScanAsync();
}
А потом в проекте Android
[assembly: Dependency(typeof(BarcodeScanner))]
namespace CodeMashScanner.Droid.Helpers
{
public class BarcodeScanner : IBarcodeScanner
{
public async Task<string> ScanAsync()
{
var scanner = new ZXing.Mobile.MobileBarcodeScanner(Forms.Context;
var scanResults = await scanner.Scan();
return scanResults.Text;
}
}
}
Я попробую поэкспериментировать с этим.
Вы дали разрешение в проекте Android - <uses-permission android: name = "android.permission.CAMERA" /> <uses-permission android: name = "android.permission.FLASHLIGHT" />