如何修复flutter本地认证的平台异常错误“auth_in_progress”?

问题描述 投票:0回答:7

我正在尝试使用 local_auth 插件在我的 flutter 应用程序中实现 Fingerprintn 身份验证。但它向我抛出平台异常错误:

“PlatformException(auth_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; }    
dart flutter fingerprint
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
投票

我解决了这个问题:

  • 改变
    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);
        }
    }
  • 是Disable,在AndroidManifest中启用SplashScreenDrawable
    android/app/src/main/AndroidManifest.xml
<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
投票

我刚刚通过从我的

android.useAndroidX=true
文件中删除
android.enableJetifier=true
gradle.properties
属性解决了这个问题。

这就是我的

gradle.properties
文件中的全部内容:

org.gradle.jvmargs=-Xmx1536M
android.enableR8=true

0
投票

通过在

stickyAuth
方法中将
true
选项设置为
authenticate
来解决。

auth.authenticate(
              stickyAuth: true,
              ...
          )

请参阅doc了解更多信息。


0
投票

我认为回复已经太晚了,但正如 local_auth 文档中所说:

您应该使用

Sticky Auth
并将其设置为 true

顺便说一句,它对我有用

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

0
投票

我也遇到了同样的问题。但以上答案都没有用。棘手的解决方案是将“sensitiveTransaction”值设置为 false。默认情况下该值为 true。

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

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

0
投票

我找到了一个简单的解决方案。在调用 LocalAuthentication().authenticate() 之前

我们可以调用await LocalAuthentication().stopAuthentication();

这帮助我修复了代码

© www.soinside.com 2019 - 2024. All rights reserved.