Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android中传递提示对象中的活动_Android_Android Studio_Android Fingerprint Api_Android Biometric Prompt_Android Biometric - Fatal编程技术网

如何在android中传递提示对象中的活动

如何在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

在我的移动应用程序中,我创建了一个单独的类文件来实现BiometricManager和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
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()--永远不要自己创建活动实例。我欢迎任何关于如何改进此答案的反馈(如果因为问题重复而被否决,我也希望有一个到规范的链接,因为我确实尝试过找到一个,我很乐意将其添加到我的规范集合中)。