2016-11-10 2 views
1

Чтобы сократить проблему: Я разрабатываю приложение для Android, которое требует от пользователей входа в систему, и поскольку может быть зарегистрировано несколько пользователей в то же время я хочу переключаться между аутентифицированными пользователями, используя сенсорные карты NFC. Все работает отлично, за исключением использования сканера штрих-кодов , когда код возвращается из сканирования любого штрих-кода и пытается нажать модель страницы, это особое исключение вызывается Java.Lang.IllegalStateException: Can not perform this action after onSaveInstanceState. Обратите внимание, что я использую Xamarin.Forms, FreshMVVM, ZXing.Mobile и, конечно, C#.Android-приложение throwing: Java.Lang.IllegalStateException, с сообщением: Не удается выполнить это действие после onSaveInstanceState

Фрагменты кода, используемые:

AndroidManifest.xml:

<activity android:name="com.name.SplashActivity"> 
    <intent-filter> 
     <category android:name="android.intent.category.LAUNCHER" /> 
     <action android:name="android.intent.action.MAIN" /> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="android.nfc.action.NDEF_DISCOVERED" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <data android:mimeType="application/com.name.nfc" /> 
    </intent-filter> 
</activity> 
<activity android:name="com.name.MainActivity"> 
</activity> 

Приведенный выше код используется для того, чтобы приложение для запуска с помощью тегов NFC. SplashActivity запусков MainActivity.

SplashActivity.cs:

protected override void OnCreate(Bundle savedInstanceState) 
{ 
    base.OnCreate(savedInstanceState); 
    StartActivity(typeof(MainActivity)); 
} 

protected override void OnResume() 
{ 
    base.OnResume(); 

    if (NfcAdapter.ActionNdefDiscovered == Intent.Action) 
    { 
     ProcessIntent(Intent); 
    } 
} 

protected override void OnNewIntent(Intent intent) 
{ 
    Intent = intent; 
} 

public void ProcessIntent(Intent intent) 
{ 
    //Code omitted to simplify the question. 
} 

Над кодом показан только знать, как я с помощью сенсорного события NFC.

код, чтобы открыть сканер штрих-кода от главной страницы модели:

public ICommand OpenCameraCommand => new Command(async() => 
{ 
    IsAvailable = false; 
    ((Command) OpenCameraCommand).ChangeCanExecute(); 
    string checkBarcode = await _scanService.CameraScanAsync().ConfigureAwait(true); 
    if (!string.IsNullOrWhiteSpace(checkBarcode)) 
    { 
     Barcode = checkBarcode; 
    } 
    IsAvailable = true; 
},() => IsAvailable); 

От службы сканирования:

public async Task<string> CameraScanAsync() 
{ 
    //AutoFocus code omitted to simplify the question 

    Result result = await _mobileBarcodeScanner.Scan(new MobileBarcodeScanningOptions { PossibleFormats = _listOfBarcodeFormats }).ConfigureAwait(false); 

    return result == null ? string.Empty : result.Text; 
} 

EDIT: код, содержащий метод страницы модели нажимной:

switch (response.Status) 
{ 
    case Case.Second: 
     await CoreMethods.PushPageModel<SecondaryPageModel>(response).ConfigureAwait(true); 
     Barcode = string.Empty; 
     return; 
    case Case.Third: 
     await CoreMethods.PushPageModel<ThirdPageModel>(response).ConfigureAwait(true); 
     Barcode = string.Empty; 
     return; 
    case Case.Fourth: 
     await CoreMethods.PushPageModel<FourthPageModel>(response).ConfigureAwait(true); 
     Barcode = string.Empty; 
     return; 
    case Case.Invalid: 
     break; 
    default: 
     throw new InvalidOperationException(); 
} 

Этот код является запускается сразу после возвращения из сканирования штрих-кода.
END EDIT

Все это работает после того, как карта NFC не трогают, и приложение запускается, до попадания в следующую строку кода. После того, как из сканера будет отправлен штрих-код:
await CoreMethods.PushPageModel<SecondaryPageModel>(response).ConfigureAwait(true);

Исключение составляет здесь. Я отлаживал свой код, чтобы проверить, что происходит. Когда камера открыта, она сначала запускает событие MainActivity OnSaveInstanceState, после успешного сканирования штрих-кода, MainActivity OnResume>MainActivity OnPostResume события увольняются в этом порядке. Затем вызывается метод PushPageModel. Обратите внимание, что когда я вручную вводим штрих-код в относительном поле, все работает нормально, это просто сканер, который генерирует это исключение.

Я искал решения здесь, в SO. Я нашел несколько ответов, в которых говорится об отказе от строки base.OnSaveInstanceState(), я попробовал это без везения, другой ответ сказал, чтобы ввести значения нежелательной почты, чтобы обойти эту проблему, попробовал это и не повезло. Я пробовал различные режимы запуска в файле AndroidManifest, например singleTop, или singleTask или singleInstance, и вам тоже не повезло.

Буду рад любой помощи, которая может быть предоставлена. Заранее спасибо.

+0

Не могли бы вы также добавить код, содержащий 'await CoreMethods.PushPageModel (штрих-код) .ConfigureAwait (true); 'line –

+0

@Jj добавил код, это всего лишь случай переключения после проверки штрих-кода –

ответ

1

MainActivity запускает несколько экземпляров при переключении с использованием NFC, добавляет в MainActivity LaunchMode как SingleTask, а затем при запуске с использованием NFC очистите Задачу и создайте новую. Хороший способ указать флаги активности - использовать атрибуты Xamarin, это лучший способ, чем добавлять их в Manifest.xml

Смежные вопросы