Чтобы сократить проблему: Я разрабатываю приложение для 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
, и вам тоже не повезло.
Буду рад любой помощи, которая может быть предоставлена. Заранее спасибо.
Не могли бы вы также добавить код, содержащий 'await CoreMethods.PushPageModel (штрих-код) .ConfigureAwait (true); 'line –
@Jj добавил код, это всего лишь случай переключения после проверки штрих-кода –