爲了縮短問題:我正在開發一個需要用戶登錄的android應用程序,並且可以記錄多個用戶在同一時間,我想在使用NFC觸摸卡的已認證用戶之間循環。除了使用條形碼掃描器ZXing.Mobile
,當代碼從掃描任何條形碼返回並試圖推送頁面模型時,除了使用Java.Lang.IllegalStateException: Can not perform this action after onSaveInstanceState
以外,一切正常。請注意,我使用Xamarin.Forms,FreshMVVM,ZXing.Mobile,當然還有C#。的代碼Android應用程序拋出: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();
}
此代碼是從掃描條形碼返回後直接開火。
編輯完
所有這一切的NFC卡被觸摸後,應用程序啓動,直到擊中的下一行代碼工作。從掃描儀返回條碼後:
await CoreMethods.PushPageModel<SecondaryPageModel>(response).ConfigureAwait(true);
例外情況正在引發此處。我調試了我的代碼來檢查發生了什麼。當相機打開時,在成功掃描條形碼後,它首先觸發MainActivity OnSaveInstanceState
事件,按順序觸發事件。然後調用PushPageModel
方法。 請注意,當我在相關字段中手動輸入條形碼時,一切正常,只是引發此異常的掃描器。
我在這裏搜索瞭解決方案。我找到了一些答案,說選擇退出base.OnSaveInstanceState()
系列,我嘗試過,沒有運氣,另一個答案說爲了解決這個問題進入垃圾價值,嘗試了,沒有運氣好。我在AndroidManifest文件中嘗試了不同的啓動模式,如singleTop
或singleTask
或singleInstance
,但沒有運氣。
我會很樂意提供任何幫助。提前致謝。
請問您還可以添加包含'await CoreMethods.PushPageModel(條形碼).ConfigureAwait真);'行 –
@Jj添加了代碼,驗證條碼後它只是一個開關盒 –