我正在尝试使用 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; }
这种情况发生在 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版本开始就很难发现了,因为插件没有抛出正确的异常,而且文档也没有告诉你实现这个基类。
我解决了这个问题:
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);
}
}
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);
}
}
我刚刚通过从我的
android.useAndroidX=true
文件中删除 android.enableJetifier=true
和 gradle.properties
属性解决了这个问题。
这就是我的
gradle.properties
文件中的全部内容:
org.gradle.jvmargs=-Xmx1536M
android.enableR8=true
通过在
stickyAuth
方法中将 true
选项设置为 authenticate
来解决。
auth.authenticate(
stickyAuth: true,
...
)
请参阅doc了解更多信息。
我认为回复已经太晚了,但正如 local_auth 文档中所说:
您应该使用
Sticky Auth
并将其设置为 true
顺便说一句,它对我有用
await _localAuthentication.authenticate(
localizedReason: 'Please authenticate to show account balance',
stickyAuth: true,
biometricOnly: true);
我也遇到了同样的问题。但以上答案都没有用。棘手的解决方案是将“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);
我找到了一个简单的解决方案。在调用 LocalAuthentication().authenticate() 之前
我们可以调用await LocalAuthentication().stopAuthentication();
这帮助我修复了代码