Что вызывает это AndroidRuntimeException?

Мне нужна помощь, чтобы понять, почему возникает это исключение. Исключение составляют:

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 - <uses-permission android: name = "android.permission.CAMERA" /> <uses-permission android: name = "android.permission.FLASHLIGHT" />

Pratius Dubey 02.08.2018 10:37

Да, я дал разрешения.

user9940552 02.08.2018 10:37

где вы дали разрешение

Pratius Dubey 02.08.2018 10:42

В свойствах проекта> манифест Android> необходимые разрешения. Он был добавлен в AndroidManifest.xml.

user9940552 02.08.2018 10:44

Просто попробуйте добавить в 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); }

Pratius Dubey 02.08.2018 10:46

Я уже добавил эти строки.

user9940552 02.08.2018 10:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
175
1

Ответы 1

Я создал для меня службу зависимостей для 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;
        }
    }
}

Я попробую поэкспериментировать с этим.

user9940552 02.08.2018 11:10

Другие вопросы по теме