dart 如何修复Flutter本地身份验证的Platform Exception错误“auth_in_progress”?

cbwuti44  于 2023-09-28  发布在  Flutter
关注(0)|答案(7)|浏览(158)

我正在尝试使用local_auth插件在我的flutter应用程序中实现fingerpritn身份验证。但它向我抛出平台异常错误:
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; }
ctrmrzij

ctrmrzij1#

这发生在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版本开始就很难找到了,因为插件没有抛出正确的异常,文档也没有告诉你实现这个基类。

jdgnovmf

jdgnovmf2#

我解决了这个问题:

  • 更改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);
    }
}
kqlmhetl

kqlmhetl3#

我只是通过从gradle.properties文件中删除android.useAndroidX=trueandroid.enableJetifier=true属性来解决这个问题。
这是我的gradle.properties文件中的所有内容:

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

qnzebej04#

通过在authenticate方法中将stickyAuth选项设置为true解决。

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

请参阅doc了解更多信息。

4uqofj5v

4uqofj5v5#

我认为现在回复已经太晚了,但正如local_auth文档中所说:
您应该使用Sticky Auth并将其设置为true
顺便说一句,这对我很有效

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

gcuhipw96#

我也有同样的问题。但上述答案都没有用。棘手的解决方案是将“sensitiveTransaction”值设置为false。默认情况下,此值为true。
当用户点击生物识别按钮时,默认情况下会出现两个对话框。一个是面部识别或指纹识别,第二个是确认对话框。在这种情况下,如果用户点击取消,权限被拒绝,它将永远不会再问。如果“sensitiveTransaction”设置为false,则在使用faceid或指纹验证后不会要求确认。

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

wlwcrazw7#

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

相关问题