smstuebe / xamarin-fingerprint

Xamarin and MvvMCross plugin for authenticate a user via fingerprint sensor
Microsoft Public License
494 stars 118 forks source link

Authenticate onResume get error "Cannot perform this action after OnSaveInstanceState" (Android) #123

Open developer9969 opened 5 years ago

developer9969 commented 5 years ago

Hi When I put the application to sleep,"move to the background" and then resume I get an error. The idea is that we should lock the app after a period of inactivity.

I have tried all sorts of things but I cannot seem to fix it. Could you please let me know of a workaround?.

Many thanks for your time!!

Steps to reproduce

  1. In the app.xaml.OnSleep method put a timer

  2. in the app.xaml.Resume method call to authenticate again

  3. you will receive the error (see below)

`
//sample noddy code

//app.xaml

    private static Timer timeOutTimer;
    protected override void OnSleep()
    {
        base.OnSleep();
        // Handle when your app sleeps
        timeOutTimer = new Timer { Interval = new TimeSpan(0, 0, 0, 3).TotalMilliseconds };
        timeOutTimer.Elapsed += OnTimeOutTimerOnElapsed;
        timeOutTimer.Enabled = true;
    }

    protected override void OnResume()
    {
        base.OnResume();
        // Handle when your app resumes
        timeOutTimer.Elapsed -= OnTimerElapsed;
        timeOutTimer.Enabled = false;
    }

    private async void OnTimerElapsed(object sender, ElapsedEventArgs e)
    {
        var authHelper = new AuthHelper();
        await authHelper.AuthenticationAsync();
    }

 public class AuthHelper
 {
    public async Task<FingerprintAuthenticationResult> AuthenticationAsync()
    {

        var dialogConfig = new AuthenticationRequestConfiguration("Put your finger!")
        { // all optional
            CancelTitle = "Cancel",
        };
        try
        {
            var result = await Plugin.Fingerprint.CrossFingerprint.Current.AuthenticateAsync(dialogConfig);

            return result;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            return null;
        }
    }
}`

Expected behavior

It should just authenticate again

Actual behavior

I get an error "Can not perform this action after onSaveInstanceState Java.Lang.IllegalStateException: Can not perform this action after onSaveInstanceState"

Crashlog

I/mono-stdout(19205): Java.Lang.IllegalStateException: Can not perform this action after onSaveInstanceState Java.Lang.IllegalStateException: Can not perform this action after onSaveInstanceState at Java.Interop.JniEnvironment+InstanceMethods.CallNonvirtualVoidMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue args) [0x00089] in <8acc8089c2ed40d08469fbaa6710a44c>:0 at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue parameters) [0x0005d] in <8acc8089c2ed40d08469fbaa6710a44c>:0 03-09 06:37:15.960 I/mono-stdout(19205): at Java.Interop.JniEnvironment+InstanceMethods.CallNonvirtualVoidMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue args) [0x00089] in <8acc8089c2ed40d08469fbaa6710a44c>:0 03-09 06:37:15.960 I/mono-stdout(19205): at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue parameters) [0x0005d] in <8acc8089c2ed40d08469fbaa6710a44c>:0 03-09 06:37:15.961 I/mono-stdout(19205): at Android.App.DialogFragment.Show (Android.App.FragmentManager manager, System.String tag) [0x0004b] in <957bbfdfda4341e2939c881206c1140a>:0 at Android.App.DialogFragment.Show (Android.App.FragmentManager manager, System.String tag) [0x0004b] in <957bbfdfda4341e2939c881206c1140a>:0 at Plugin.Fingerprint.Dialog.FingerprintDialogFragment.Show (Android.App.FragmentManager manager, System.String tag) [0x0000b] in C:\Projekte\xamarin-fingerprint\src\Plugin.Fingerprint.Android\Dialog\FingerprintDialogFragment.cs:117 at Plugin.Fingerprint.Dialog.FingerprintDialogFragment+d__21.MoveNext () [0x0002f] in C:\Projekte\xamarin-fingerprint\src\Plugin.Fingerprint.Android\Dialog\FingerprintDialogFragment.cs:106 --- End of stack trace from previous location where exception was thrown ---

03-09 06:37:15.962 I/mono-stdout(19205): at Plugin.Fingerprint.Dialog.FingerprintDialogFragment.Show (Android.App.FragmentManager manager, System.String tag) [0x0000b] in C:\Projekte\xamarin-fingerprint\src\Plugin.Fingerprint.Android\Dialog\FingerprintDialogFragment.cs:117 03-09 06:37:15.962 I/mono-stdout(19205): at Plugin.Fingerprint.Dialog.FingerprintDialogFragment+d21.MoveNext () [0x0002f] in C:\Projekte\xamarin-fingerprint\src\Plugin.Fingerprint.Android\Dialog\FingerprintDialogFragment.cs:106 03-09 06:37:15.963 I/mono-stdout(19205): --- End of stack trace from previous location where exception was thrown --- 03-09 06:37:15.964 I/mono-stdout(19205): at Plugin.Fingerprint.Contract.AndroidFingerprintImplementationBase+d0.MoveNext () [0x00042] in C:\Projekte\xamarin-fingerprint\src\Plugin.Fingerprint.Android\Contract\AndroidFingerprintImplementationBase.cs:17 at Plugin.Fingerprint.Contract.AndroidFingerprintImplementationBase+d0.MoveNext () [0x00042] in C:\Projekte\xamarin-fingerprint\src\Plugin.Fingerprint.Android\Contract\AndroidFingerprintImplementationBase.cs:17 --- End of stack trace from previous location where exception was thrown --- at Plugin.Fingerprint.Abstractions.FingerprintImplementationBase+d1.MoveNext () [0x000bb] in C:\Projekte\xamarin-fingerprint\src\Plugin.Fingerprint.Abstractions\FingerprintImplementationBase.cs:25 --- End of stack trace from previous location where exception was thrown --- at FingerprintDroid.AuthHelper+d1.MoveNext () [0x00053] in C:\Dev\Mobile\Android\FingerprintDroid\FingerprintDroid\AuthHelper.cs:23 03-09 06:37:15.964 I/mono-stdout(19205): --- End of stack trace from previous location where exception was thrown --- 03-09 06:37:15.965 I/mono-stdout(19205): at Plugin.Fingerprint.Abstractions.FingerprintImplementationBase+d1.MoveNext () [0x000bb] in C:\Projekte\xamarin-fingerprint\src\Plugin.Fingerprint.Abstractions\FingerprintImplementationBase.cs:25 03-09 06:37:15.965 I/mono-stdout(19205): --- End of stack trace from previous location where exception was thrown --- --- End of managed Java.Lang.IllegalStateException stack trace --- java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1881) at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1904) at android.app.BackStackRecord.commitInternal(BackStackRecord.java:688) at android.app.BackStackRecord.commit(BackStackRecord.java:646)

03-09 06:37:15.966 I/mono-stdout(19205): at FingerprintDroid.AuthHelper+d__1.MoveNext () [0x00053] in C:\Dev\Mobile\Android\FingerprintDroid\FingerprintDroid\AuthHelper.cs:23 03-09 06:37:15.966 I/mono-stdout(19205): --- End of managed Java.Lang.IllegalStateException stack trace --- 03-09 06:37:15.967 I/mono-stdout(19205): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 03-09 06:37:15.967 I/mono-stdout(19205): at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1881) 03-09 06:37:15.968 I/mono-stdout(19205): at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1904) 03-09 06:37:15.968 I/mono-stdout(19205): at android.app.BackStackRecord.commitInternal(BackStackRecord.java:688) at android.app.DialogFragment.show(DialogFragment.java:238) 03-09 06:37:15.969 I/mono-stdout(19205): at android.app.BackStackRecord.commit(BackStackRecord.java:646) 03-09 06:37:15.969 I/mono-stdout(19205): at android.app.DialogFragment.show(DialogFragment.java:238) 03-09 06:37:15.970 I/mono-stdout(19205): Thread finished: #6 The thread 0x6 has exited with code 0 (0x0). Thread finished: #4 The thread 0x4 has exited with code 0 (0x0).

Configuration

Version of the Plugin: 1.49

Platform:Android 8.1

Device: e.g. any device

smsissuechecker commented 5 years ago

Hi @developer9969,

I'm the friendly issue checker. Thanks for using the issue template :star2: I appreciate it very much. I'm sure, the maintainers of this repository will answer, soon.

amrosama2020 commented 5 years ago

+1

mfawzyCE commented 5 years ago

This issue is also happening with me on multiple devices and different android versions. Any solution?

kyluke commented 5 years ago

I'm also facing this, any update?

valdetero commented 5 years ago

I am also seeing this issue. Anyone find a resolution or workaround?

developer9969 commented 5 years ago

I am making an assumption here. I think the owner no longer supports this plugin.I have not seen any reply to anybody lately. I hope I am wrong

filipleifer commented 4 years ago

Same problem with Plugin.Fingerprint 1.4.9 causing app crash but it seems to be in another place:

FingerprintDialogFragment.Show (Android.App.FragmentManager manager, System.String tag) Java.Lang.IllegalStateException: Can not perform this action after onSaveInstanceState

Stack

JniEnvironment+InstanceMethods.CallNonvirtualVoidMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue args) JniPeerMembers+JniInstanceMethods.InvokeVirtualVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue parameters) DialogFragment.Show (Android.App.FragmentManager manager, System.String tag) FingerprintDialogFragment.Show (Android.App.FragmentManager manager, System.String tag) FingerprintDialogFragment.ShowAsync (Plugin.Fingerprint.Abstractions.AuthenticationRequestConfiguration config, Plugin.Fingerprint.Contract.IAndroidFingerprintImplementation implementation, System.Threading.CancellationToken cancellationToken) AndroidFingerprintImplementationBase.NativeAuthenticateAsync (Plugin.Fingerprint.Abstractions.AuthenticationRequestConfiguration authRequestConfig, System.Threading.CancellationToken cancellationToken) FingerprintImplementationBase.AuthenticateAsync (Plugin.Fingerprint.Abstractions.AuthenticationRequestConfiguration authRequestConfig, System.Threading.CancellationToken cancellationToken)