如何解决如何在android中的BiometricPrompt对象中传递活动
在我的移动应用程序中,我创建了一个单独的类文件来实现 BiometricManager 和 BiometricPrompt 以使用指纹身份验证。我必须在三个活动中触发生物识别弹出窗口,所以我在单独的类文件中创建了一个通用函数。但是 BiometricPrompt 对象具有三个参数,例如活动、执行程序和身份验证回调。如果我传递登录活动对象(在下面的代码中),那么它会抛出一个错误,如“您的活动尚未附加到应用程序实例。您不能在 onCreate 调用之前请求 ViewModel”。有人可以帮忙解决这个问题。提前致谢。
NewLoginActivity newLoginActivity = new NewLoginActivity();
BiometricManager biometricManager = BiometricManager.from(context);
switch (biometricManager.canAuthenticate(BIOMETRIC_STRONG | DEVICE_CREDENTIAL)) {
case BiometricManager.BIOMETRIC_SUCCESS:
Log.d("MY_APP_TAG","App can authenticate using biometrics.");
break;
case BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE:
Log.e("MY_APP_TAG","No biometric features available on this device.");
break;
case BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE:
Log.e("MY_APP_TAG","Biometric features are currently unavailable.");
break;
case BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED:
// Prompts the user to create credentials that your app accepts.
final Intent enrollIntent = new Intent(Settings.ACTION_BIOMETRIC_ENROLL);
enrollIntent.putExtra(Settings.EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED,BIOMETRIC_STRONG | DEVICE_CREDENTIAL);
startActivityForResult(enrollIntent,REQUEST_CODE);
break;
}
executor = ContextCompat.getMainExecutor(context);
biometricPrompt = new BiometricPrompt(newLoginActivity,executor,new BiometricPrompt.AuthenticationCallback() {
@Override
public void onAuthenticationError(int errorCode,@NonNull CharSequence errString) {
super.onAuthenticationError(errorCode,errString);
Toast.makeText(getApplicationContext(),"Authentication error: " + errString,Toast.LENGTH_SHORT)
.show();
}
@Override
public void onAuthenticationSucceeded(
@NonNull BiometricPrompt.AuthenticationResult result) {
super.onAuthenticationSucceeded(result);
Toast.makeText(getApplicationContext(),"Authentication succeeded!",Toast.LENGTH_SHORT).show();
authErrorStatus.setVisibility(View.GONE);
login();
}
@Override
public void onAuthenticationFailed() {
super.onAuthenticationFailed();
Toast.makeText(getApplicationContext(),"Authentication failed",Toast.LENGTH_SHORT)
.show();
}
});
promptInfo = new BiometricPrompt.PromptInfo.Builder()
.setTitle("Biometric login for my app")
.setSubtitle("Log in using your biometric credential")
.setNegativeButtonText("Use account password")
.build();
请检查我在 logcat 中出现的以下日志错误。
2021-05-11 12:21:21.245 6808-6808/com.purchasingpower.ppow E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.purchasingpower.ppow,PID: 6808
java.lang.IllegalStateException: Your activity is not yet attached to the Application instance. You can't request ViewModel before onCreate call.
at androidx.activity.ComponentActivity.getViewModelStore(ComponentActivity.java:263)
at androidx.lifecycle.ViewModelProvider.<init>(ViewModelProvider.java:99)
at androidx.biometric.BiometricPrompt.getViewModel(BiometricPrompt.java:1027)
at androidx.biometric.BiometricPrompt.<init>(BiometricPrompt.java:844)
at com.app.purchasingpower.utility.BiometricHandler.checkBiometricSensor(BiometricHandler.java:109)
at com.app.purchasingpower.activity.NewLoginActivity.checkFingerprintSensor(NewLoginActivity.java:861)
at com.app.purchasingpower.activity.NewLoginActivity.access$2900(NewLoginActivity.java:92)
at com.app.purchasingpower.activity.NewLoginActivity$6.onCallback(NewLoginActivity.java:802)
at com.app.purchasingpower.activity.NewLoginActivity$1.onCallback(NewLoginActivity.java:324)
at com.app.purchasingpower.volley.JsonObjectResponseController$1$1.onResponse(JsonObjectResponseController.java:131)
at com.app.purchasingpower.volley.JsonObjectResponseController$1$1.onResponse(JsonObjectResponseController.java:127)
at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:83)
at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:106)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
2021-05-11 12:21:21.282 6808-6808/com.purchasingpower.ppow I/Process: Sending signal. PID: 6808 SIG: 9
解决方法
您正在自己创建 Activity
的实例:
NewLoginActivity newLoginActivity = new NewLoginActivity();
您永远不应该在 Android 中创建 Activity
实例。系统将始终为您创建。
解决方案取决于此代码的位置:如果它在 FragmentActivity
子类中,只需传递 this
。如果它在 Fragment
中,则传递 getActivity()
。如果它在另一个类中,您需要将 FragmentActivity
作为参数传递给该类,以便您可以将其传递给 BiometricPrompt
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。