如何在android中传递提示对象中的活动
在我的移动应用程序中,我创建了一个单独的类文件来实现BiometricManager和BiometricPrompt以使用指纹身份验证。我必须在三个活动中触发生物识别弹出窗口,因此我在单独的类文件中创建了一个公共函数。但是,提示对象有三个参数,例如活动、执行器和身份验证回调。如果我传递了登录活动对象(在下面的代码中),那么它将抛出一个错误,因为“您的活动尚未连接到应用程序实例。在onCreate调用“”之前,您不能请求ViewModel。有人能帮忙解决这个问题吗。提前谢谢如何在android中传递提示对象中的活动,android,android-studio,android-fingerprint-api,android-biometric-prompt,android-biometric,Android,Android Studio,Android Fingerprint Api,Android Biometric Prompt,Android Biometric,在我的移动应用程序中,我创建了一个单独的类文件来实现BiometricManager和BiometricPrompt以使用指纹身份验证。我必须在三个活动中触发生物识别弹出窗口,因此我在单独的类文件中创建了一个公共函数。但是,提示对象有三个参数,例如活动、执行器和身份验证回调。如果我传递了登录活动对象(在下面的代码中),那么它将抛出一个错误,因为“您的活动尚未连接到应用程序实例。在onCreate调用“”之前,您不能请求ViewModel。有人能帮忙解决这个问题吗。提前谢谢 NewLoginAct
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
2021-05-11 12:21:21.245 6808-6808/com.purchasingpower.ppow E/AndroidRuntime:致命异常:main
流程:com.purchasingpower.ppow,PID:6808
java.lang.IllegalStateException:您的活动尚未附加到应用程序实例。在onCreate调用之前不能请求ViewModel。
位于androidx.activity.ComponentActivity.getViewModelStore(ComponentActivity.java:263)
位于androidx.lifecycle.ViewModelProvider。(ViewModelProvider.java:99)
位于androidx.biometric.BiometricPrompt.getViewModel(BiometricPrompt.java:1027)
在androidx.biometric.BiometricPrompt.(BiometricPrompt.java:844)
位于com.app.purchasingpower.utility.BiometricHandler.checkBiometricSensor(BiometricHandler.java:109)
在com.app.purchasingpower.activity.NewLoginActivity.checkFingerprintSensor上(NewLoginActivity.java:861)
在com.app.purchasingpower.activity.NewLoginActivity.access$2900(NewLoginActivity.java:92)
在com.app.purchasingpower.activity.NewLoginActivity$6.onCallback(NewLoginActivity.java:802)上
在com.app.purchasingpower.activity.NewLoginActivity$1.onCallback上(NewLoginActivity.java:324)
在com.app.purchasingpower.volley.JsonObjectResponseController$1$1.onResponse(JsonObjectResponseController.java:131)
在com.app.purchasingpower.volley.JsonObjectResponseController$1$1.onResponse(JsonObjectResponseController.java:127)
位于com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:83)
位于com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:106)
位于android.os.Handler.handleCallback(Handler.java:883)
位于android.os.Handler.dispatchMessage(Handler.java:100)
位于android.os.Looper.loop(Looper.java:214)
位于android.app.ActivityThread.main(ActivityThread.java:7356)
位于java.lang.reflect.Method.invoke(本机方法)
位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
2021-05-11 12:21:21.282 6808-6808/com.purchasingpower.ppow I/Process:发送信号。PID:6808信号:9
您正在自己创建一个活动的实例:
NewLoginActivity NewLoginActivity=newNewLoginActivity();
您永远不应该在Android中创建活动
实例。系统将始终为您创建它
解决方案取决于此代码的位置:如果它位于FragmentActivity
子类中,只需传递this
。如果它位于片段中
,请传递getActivity()
。如果它在另一个类中,您需要将碎片活动
作为参数传递给该类,以便您可以将其传递给生物提示
我们无法帮助修复无法看到的代码。请考虑编辑你的问题并添加一个显示你的代码(你的共同功能和你如何调用它)的代码。我还添加了代码和日志。请检查并帮助我。NewLoginActivity NewLoginActivity=newnewloginactivity()代码>--永远不要自己创建活动实例。我欢迎任何关于如何改进此答案的反馈(如果因为问题重复而被否决,我也希望有一个到规范的链接,因为我确实尝试过找到一个,我很乐意将其添加到我的规范集合中)。