如何修复Flutter本地身份验证中的平台异常错误“auth_in_progress”?

11

我正在尝试使用local_auth插件在我的Flutter应用程序中实现指纹认证。但是它会抛出“Platform Exception Error: PlatformException(auth_in_progress, Authentication in progress, null)”。

final LocalAuthentication _localAuth = LocalAuthentication();
bool authenticated = false;
try {
  authenticated = await _localAuth.authenticateWithBiometrics(
    localizedReason: 'Scan your fingerprint to authenticate',
    useErrorDialogs: true,
    stickyAuth: false
  );
} on PlatformException
catch(e) {
  print(e);
}
return authenticated; }    

我有同样的问题。 - Rocologo
7个回答

8
这是在Android上发生的事情。您需要修改MainActivity以实现FlutterFragmentActivity,以使用local_auth插件。将您的代码从此处更改(例如Kotlin):
import android.os.Bundle

import io.flutter.app.FlutterActivity
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity: FlutterActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    GeneratedPluginRegistrant.registerWith(this)
  }
}

变成这个样子:

import android.os.Bundle

import io.flutter.app.FlutterFragmentActivity
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity: FlutterFragmentActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    GeneratedPluginRegistrant.registerWith(this)
  }
}

此外,您需要将以下两行添加到您的gradle.properties文件中。

android.useAndroidX=true
android.enableJetifier=true

自版本0.5.1起,由于插件未抛出正确的异常并且文档也没有告诉您要实现此基类,因此很难找到此错误。

1
我正在使用 local_auth: ^0.6.1+3。我遇到了 GeneratedPluginRegistrant.registerWith(this) 代码行的问题。registerWith 需要一个 flutterEngine 对象,而我正在提供 MainActivity 上下文。 - Aanal Shah
2
很遗憾,它不起作用。本地认证第一次可以工作,但是在你最小化一个应用程序然后再最大化时,认证活动会出现,但是当你触摸扫描器时应用程序会崩溃。 - Konstantin
@Konstantin 有什么建议吗? - Erick Lanford Xenes

1
我解决了这个问题:
  • 更改android/app/src/main/kotlin/MainActivity.kt
    package ....
   
    import androidx.annotation.NonNull;
    import io.flutter.embedding.android.FlutterFragmentActivity
    import io.flutter.embedding.engine.FlutterEngine
    import io.flutter.plugins.GeneratedPluginRegistrant
    
    class MainActivity: FlutterFragmentActivity() {
        override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
            GeneratedPluginRegistrant.registerWith(flutterEngine);
        }
    }
  • 在 AndroidManifest 文件的 android/app/src/main/AndroidManifest.xml 中禁用或启用 SplashScreenDrawable。
<meta-data android:name="io.flutter.embedding.android.SplashScreenDrawable" android:resource="@drawable/launch_background" />

或者Java版本
import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterFragmentActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugins.GeneratedPluginRegistrant;


public class MainActivity extends FlutterFragmentActivity {

    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);
    }
}

0

我遇到了同样的问题。但是以上答案都没有用。一个巧妙的解决方案是将“sensitiveTransaction”值设置为false。默认情况下,此值为true。

当用户点击生物识别按钮时,默认情况下会出现两个对话框。一个是面容ID或指纹识别,第二个是确认对话框。在这种情况下,如果用户点击取消,则会被拒绝权限,并且永远不会再次询问。如果将“sensitiveTransaction”设置为false,则在通过面容ID或指纹验证后不会要求确认。

await localAuthObject.authenticate(
              localizedReason:
                  'Scan your fingerprint (or face or whatever) to authenticate',
              useErrorDialogs: false,
              sensitiveTransaction: false,
              stickyAuth: true,
              biometricOnly:
                  false);

0

我觉得回复有点晚了,但是在 local_auth 的文档中说:

你应该使用 Sticky Auth 并将其设置为 true

顺便说一下,这对我起作用了。

 await _localAuthentication.authenticate(
          localizedReason: 'Please authenticate to show account balance',
          stickyAuth: true,
          biometricOnly: true);

0
我找到了一个简单的解决方案。在调用LocalAuthentication().authenticate()之前,我们可以调用await LocalAuthentication().stopAuthentication();。这帮助我修复了代码。

0
在authenticate方法中将stickyAuth选项设置为true即可解决。
auth.authenticate(
              stickyAuth: true,
              ...
          )

请参阅文档了解更多信息。

0
我刚刚通过从我的gradle.properties文件中删除android.useAndroidX=true和android.enableJetifier=true属性来解决了这个问题。
这是我gradle.properties文件中所有的内容:
org.gradle.jvmargs=-Xmx1536M
android.enableR8=true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接