BiometricPrompt.Builder.setDeviceCredentialAllowed(boolean)方法过时了,怎么破。

本文主要是介绍BiometricPrompt.Builder.setDeviceCredentialAllowed(boolean)方法过时了,怎么破。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android R中已经将该API setDeviceCredentialAllowed() 标记为@Deprecated,即API=30开始不推荐使用该API。

先来看看官方API怎么说?

API29_biometricPrompt

明确说,请使用setAllowedAuthenticators(int)代替。

API30_BiometricPrompt

怎么用,上图API已经说的很清晰,举个栗子

int authenticators = BiometricManager.Authenticators.DEVICE_CREDENTIAL | BiometricManager.Authenticators.BIOMETRIC_WEAK;
Log.d(TAG, "set: authenticators:" + authenticators);
builder.setAllowedAuthenticators(authenticators);

当然为了兼容Q的行为,建议API判断兼容。

if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) {builder.setDeviceCredentialAllowed(true);
} else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){int authenticators = BiometricManager.Authenticators.DEVICE_CREDENTIAL | BiometricManager.Authenticators.BIOMETRIC_WEAK;Log.d(TAG, "showLockScreen: authenticators:" + authenticators);builder.setAllowedAuthenticators(authenticators);
}

根据参数解释,可以是三个值当中任何一个或者多个的组合。

 A bit field representing all valid authenticator types that may be invoked by the prompt. Value is either 0 or a combination of BiometricManager.Authenticators.BIOMETRIC_STRONG, BiometricManager.Authenticators.BIOMETRIC_WEAK, and BiometricManager.Authenticators.DEVICE_CREDENTIAL.

真的是这样吗?

如果我单个单个的给,比如:BiometricManager.Authenticators.BIOMETRIC_WEAK。程序FC.

07-07 04:13:35.816 20008 20008 D activity1: click btn...
07-07 04:13:35.844 20008 20008 D activity1: top activity is dsfingerprint.dy.test.com.dsfingerprint.MainActivity
07-07 04:13:35.849 20008 20008 D activity1: showLockScreen: authenticators:255
07-07 04:13:35.850 20008 20008 D AndroidRuntime: Shutting down VM
07-07 04:13:35.855 20008 20008 E AndroidRuntime: FATAL EXCEPTION: main
07-07 04:13:35.855 20008 20008 E AndroidRuntime: Process: com.dsfingerprint, PID: 20008
07-07 04:13:35.855 20008 20008 E AndroidRuntime: java.lang.IllegalStateException: Could not execute method for android:onClick
07-07 04:13:35.855 20008 20008 E AndroidRuntime: 	at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:414)
07-07 04:13:35.855 20008 20008 E AndroidRuntime: 	at android.view.View.performClick(View.java:7455)
07-07 04:13:35.855 20008 20008 E AndroidRuntime: 	at android.view.View.performClickInternal(View.java:7428)
07-07 04:13:35.855 20008 20008 E AndroidRuntime: 	at android.view.View.access$3600(View.java:813)
07-07 04:13:35.855 20008 20008 E AndroidRuntime: 	at android.view.View$PerformClick.run(View.java:28480)
07-07 04:13:35.855 20008 20008 E AndroidRuntime: 	at android.os.Handler.handleCallback(Handler.java:938)
07-07 04:13:35.855 20008 20008 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:99)
07-07 04:13:35.855 20008 20008 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:223)
07-07 04:13:35.855 20008 20008 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:7736)
07-07 04:13:35.855 20008 20008 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
07-07 04:13:35.855 20008 20008 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:621)
07-07 04:13:35.855 20008 20008 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:997)
07-07 04:13:35.855 20008 20008 E AndroidRuntime: Caused by: java.lang.reflect.InvocationTargetException
07-07 04:13:35.855 20008 20008 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
07-07 04:13:35.855 20008 20008 E AndroidRuntime: 	at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
07-07 04:13:35.855 20008 20008 E AndroidRuntime: 	... 11 more
07-07 04:13:35.855 20008 20008 E AndroidRuntime: Caused by: java.lang.IllegalArgumentException: Negative text must be set and non-empty
07-07 04:13:35.855 20008 20008 E AndroidRuntime: 	at android.hardware.biometrics.BiometricPrompt$Builder.build(BiometricPrompt.java:432)
07-07 04:13:35.855 20008 20008 E AndroidRuntime: 	at dsfingerprint.dy.test.com.dsfingerprint.MainActivity.showLockScreen(MainActivity.java:603)
07-07 04:13:35.855 20008 20008 E AndroidRuntime: 	at dsfingerprint.dy.test.com.dsfingerprint.MainActivity.onRemoveBtnClick(MainActivity.java:429)
07-07 04:13:35.855 20008 20008 E AndroidRuntime: 	... 13 more

看看BiometricPrompt源码。

AndroidR/frameworks/base/core/java/android/hardware/biometrics/BiometricPrompt.java

AndroidR/frameworks/base/core/java/android/hardware/biometrics/BiometricPrompt.java/*** Creates a {@link BiometricPrompt}.** @return An instance of {@link BiometricPrompt}.** @throws IllegalArgumentException If any required fields are unset, or if given any* invalid combination of field values.*/@NonNullpublic BiometricPrompt build() {final CharSequence title = mBundle.getCharSequence(KEY_TITLE);final CharSequence negative = mBundle.getCharSequence(KEY_NEGATIVE_TEXT);final boolean useDefaultTitle = mBundle.getBoolean(KEY_USE_DEFAULT_TITLE, false);final boolean deviceCredentialAllowed = mBundle.getBoolean(KEY_ALLOW_DEVICE_CREDENTIAL);final @Authenticators.Types int authenticators =mBundle.getInt(KEY_AUTHENTICATORS_ALLOWED, 0);final boolean willShowDeviceCredentialButton = deviceCredentialAllowed|| (authenticators & Authenticators.DEVICE_CREDENTIAL) != 0;if (TextUtils.isEmpty(title) && !useDefaultTitle) {throw new IllegalArgumentException("Title must be set and non-empty");} else if (TextUtils.isEmpty(negative) && !willShowDeviceCredentialButton) {//本条件请注意throw new IllegalArgumentException("Negative text must be set and non-empty");} else if (!TextUtils.isEmpty(negative) && willShowDeviceCredentialButton) {throw new IllegalArgumentException("Can't have both negative button behavior"+ " and device credential enabled");}return new BiometricPrompt(mContext, mBundle, mPositiveButtonInfo, mNegativeButtonInfo);}}

抛出异常的条件判断中,只跟两个输入有关一个就是authenticators,另一个是@Deprecated API setDeviceCredentialAllowed()。

  /* @deprecated Replaced by {@link #setAllowedAuthenticators(int)}.*/@Deprecated@NonNullpublic Builder setDeviceCredentialAllowed(boolean allowed) {mBundle.putBoolean(KEY_ALLOW_DEVICE_CREDENTIAL, allowed);return this;}

如果想不用过时API setDeviceCredentialAllowed(),这个传入的参数authenticators很重要,最起码是BiometricManager.Authenticators.DEVICE_CREDENTIAL或者它和其它另外两个的结合。

讲了这么多,先来看看,这个三个authenticators可能值是多少。

public interface Authenticators {int EMPTY_SET = 0x0000;int BIOMETRIC_MAX_STRENGTH = 0x0001;int BIOMETRIC_STRONG = 0x000F;int BIOMETRIC_WEAK = 0x00FF;int BIOMETRIC_CONVENIENCE = 0x0FFF;int BIOMETRIC_MIN_STRENGTH = 0x7FFF;int DEVICE_CREDENTIAL = 1 << 15;
}

两个byte的bit位就这么分掉了,不过只有上述API文档提到的三个才开放给到普通应用使用,其它平台内部使用。
基于上述代码追溯,所以直接给0 也是不可以的。程序会发生异常.

07-07 04:32:16.903 16143 16143 D activity1: onResume: 
07-07 04:32:18.515 16143 16143 D activity1: click btn...
07-07 04:32:18.525 16143 16143 D activity1: top activity is dsfingerprint.dy.test.com.dsfingerprint.MainActivity
07-07 04:32:18.531 16143 16143 D activity1: showLockScreen: authenticators:0
07-07 04:32:18.532 16143 16143 D AndroidRuntime: Shutting down VM
07-07 04:32:18.537 16143 16143 E AndroidRuntime: FATAL EXCEPTION: main
07-07 04:32:18.537 16143 16143 E AndroidRuntime: Process: com.dsfingerprint, PID: 16143
07-07 04:32:18.537 16143 16143 E AndroidRuntime: java.lang.IllegalStateException: Could not execute method for android:onClick
07-07 04:32:18.537 16143 16143 E AndroidRuntime: 	at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:414)
07-07 04:32:18.537 16143 16143 E AndroidRuntime: 	at android.view.View.performClick(View.java:7455)
07-07 04:32:18.537 16143 16143 E AndroidRuntime: 	at android.view.View.performClickInternal(View.java:7428)
07-07 04:32:18.537 16143 16143 E AndroidRuntime: 	at android.view.View.access$3600(View.java:813)
07-07 04:32:18.537 16143 16143 E AndroidRuntime: 	at android.view.View$PerformClick.run(View.java:28480)
07-07 04:32:18.537 16143 16143 E AndroidRuntime: 	at android.os.Handler.handleCallback(Handler.java:938)
07-07 04:32:18.537 16143 16143 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:99)
07-07 04:32:18.537 16143 16143 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:223)
07-07 04:32:18.537 16143 16143 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:7736)
07-07 04:32:18.537 16143 16143 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
07-07 04:32:18.537 16143 16143 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:621)
07-07 04:32:18.537 16143 16143 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:997)
07-07 04:32:18.537 16143 16143 E AndroidRuntime: Caused by: java.lang.reflect.InvocationTargetException
07-07 04:32:18.537 16143 16143 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
07-07 04:32:18.537 16143 16143 E AndroidRuntime: 	at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
07-07 04:32:18.537 16143 16143 E AndroidRuntime: 	... 11 more
07-07 04:32:18.537 16143 16143 E AndroidRuntime: Caused by: java.lang.IllegalArgumentException: Negative text must be set and non-empty
07-07 04:32:18.537 16143 16143 E AndroidRuntime: 	at android.hardware.biometrics.BiometricPrompt$Builder.build(BiometricPrompt.java:432)
07-07 04:32:18.537 16143 16143 E AndroidRuntime: 	at dsfingerprint.dy.test.com.dsfingerprint.MainActivity.showLockScreen(MainActivity.java:603)
07-07 04:32:18.537 16143 16143 E AndroidRuntime: 	at dsfingerprint.dy.test.com.dsfingerprint.MainActivity.onRemoveBtnClick(MainActivity.java:429)
07-07 04:32:18.537 16143 16143 E AndroidRuntime: 	... 13 more

除非结合过时的API setDeviceCredentialAllowed(true)。

但是如此一来,申请BiometricPrompt变得无意义了。

if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) {builder.setDeviceCredentialAllowed(true);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {builder.setDeviceCredentialAllowed(true);int authenticators = 0;//BiometricManager.Authenticators.DEVICE_CREDENTIAL | BiometricManager.Authenticators.BIOMETRIC_WEAK;Log.d(TAG, "showLockScreen: authenticators:" + authenticators);builder.setAllowedAuthenticators(authenticators);
}final BiometricPrompt bp = builder.build();
bp.authenticate(mCancelSig,runnable -> {Log.d(TAG, "showLockScreen: xxx");},authenticationCallback);

log:

07-07 04:33:51.690 25788 25788 D activity1: click btn...
07-07 04:33:51.717 25788 25788 D activity1: top activity is dsfingerprint.dy.test.com.dsfingerprint.MainActivity
07-07 04:33:51.721 25788 25788 D activity1: showLockScreen: authenticators:0
07-07 04:33:51.729   807   807 E BiometricService: No authenticators requested
07-07 04:33:51.730 25788 25808 D activity1: showLockScreen: xxx

如果,直接使用@Deprecated API  setDeviceCredentialAllowed(true),他默认会找到BiometricManager.Authenticators.DEVICE_CREDENTIAL,如果只设置了密码(Pattern/PIN/password)的话。
效果等同builder.setAllowedAuthenticators(BiometricManager.Authenticators.DEVICE_CREDENTIAL)。
但是如果还录入了指纹,跟Android Q表现没差。

如果密码也没设置呢?无意义。报BIOMETRIC_NOT_EROLLED(6),执行Executor runnable。

01-02 06:37:16.924  1783  1783 D activity1: click btn...
01-02 06:37:16.938  1783  1783 D activity1: top activity is dsfingerprint.dy.test.com.dsfingerprint.MainActivity
01-02 06:37:16.945   991   991 D BiometricService: Package: com.dsfingerprint Authenticator ID: 0 Modality: 2 Reported Modality: 2 Status: 6
01-02 06:37:16.947  1783  2094 D activity1: showLockScreen: xxx

回过来,直接使用推荐API只设置BiometricManager.Authenticators.DEVICE_CREDENTIAL,情况如何?
1)无密码,无指纹

报BIOMETRIC_INSUFFICIENT_STRENGTH(3)

01-02 06:42:04.071  4549  4549 D activity1: click btn...
01-02 06:42:04.079  4549  4549 D activity1: top activity is dsfingerprint.dy.test.com.dsfingerprint.MainActivity
01-02 06:42:04.083  4549  4549 D activity1: showLockScreen: authenticators:32768
01-02 06:42:04.093   991   991 D BiometricService: Package: com.dsfingerprint Authenticator ID: 0 Modality: 2 Reported Modality: 0 Status: 3
01-02 06:42:04.094  4549  4572 D activity1: showLockScreen: xxx

2)只设置密码,无指纹
报BIOMETRIC_INSUFFICIENT_STRENGTH(3),无论直接返回验证失败,还是验证pass,都直接执行Executor runnable,authenticationCallback无回调。

01-02 06:44:53.711  5689  5689 D activity1: click btn...
01-02 06:44:53.727  5689  5689 D activity1: top activity is dsfingerprint.dy.test.com.dsfingerprint.MainActivity
01-02 06:44:53.727  5689  5689 D activity1: showLockScreen: authenticators:32768
01-02 06:44:53.738   991   991 D BiometricService: Package: com.dsfingerprint Authenticator ID: 0 Modality: 2 Reported Modality: 0 Status: 3
01-02 06:44:53.738   991   991 D BiometricService: Creating auth session. Modality: 0, cookie: 37872452, authenticators: 32768
01-02 06:44:53.738   991   991 D BiometricService: New AuthSession, mSysUiSessionId: 1246244778
01-02 06:44:53.739  2405  2405 D BiometricPrompt/AuthController: showAuthenticationDialog, authenticators: 32768, biometricModality: 0, requireConfirmation: false, operationId: 0, sysUiSessionId: 1246244778
01-02 06:44:53.745  2405  2405 D BiometricPrompt/AuthController: userId: 0 savedState: null mCurrentDialog: null newDialog: com.android.systemui.biometrics.AuthContainerView{df74000 VFE...... .F....I. 0,0-0,0} type: 0 sysUiSessionId: 1246244778
01-02 06:44:53.786  6128  6128 D tctsidebar: TctSideBarService   :onChange listening package tag : 1 , com.android.systemui/BiometricPrompt
01-02 06:44:55.343   991  3109 D LockSettingsService: spBasedDoVerifyCredential: user=0 challengeType=0 hasEnrolledBiometrics=false
01-02 06:44:55.490  1150  1150 D keystore: AddAuthenticationToken: timestamp = 10985330, time_received = 3483
01-02 06:44:55.624  1150  1150 D keystore: AddAuthenticationToken: timestamp = 10985466, time_received = 3483
01-02 06:44:55.721  1150  1150 D keystore: AddAuthenticationToken: timestamp = 10985562, time_received = 3483
01-02 06:44:56.120  2405  2405 D BiometricPrompt/AuthContainerView: pendingCallback: 7 sysUISessionId: 1246244778
01-02 06:44:56.120  2405  2405 D BiometricPrompt/AuthController: onDialogDismissed: 7
01-02 06:44:56.121  2405  2405 D BiometricPrompt/AuthContainerView: Removing container, mSysUiSessionId: 1246244778
01-02 06:44:56.122  1150  1150 D keystore: AddAuthenticationToken: timestamp = 10985562, time_received = 3483
01-02 06:44:56.123   991   991 E BiometricService: mTokenEscrow is null
01-02 06:44:56.124  5689  5707 D activity1: showLockScreen: xxx

3)录入指纹,
报BIOMETRIC_INSUFFICIENT_STRENGTH(3), 只能弹出Pattern、PIN、Password验证界面,无法指纹验证, 执行Executor runnable, authenticationCallback无回调。

01-02 06:47:13.297  5689  5689 D activity1: click btn...
01-02 06:47:13.303  5689  5689 D activity1: top activity is dsfingerprint.dy.test.com.dsfingerprint.MainActivity
01-02 06:47:13.303  5689  5689 D activity1: showLockScreen: authenticators:32768
01-02 06:47:13.309   991   991 D BiometricService: Package: com.dsfingerprint Authenticator ID: 0 Modality: 2 Reported Modality: 0 Status: 3
01-02 06:47:13.309   991   991 D BiometricService: Creating auth session. Modality: 0, cookie: 1761879584, authenticators: 32768
01-02 06:47:13.309   991   991 D BiometricService: New AuthSession, mSysUiSessionId: -1877024172
01-02 06:47:13.310  2405  2405 D BiometricPrompt/AuthController: showAuthenticationDialog, authenticators: 32768, biometricModality: 0, requireConfirmation: false, operationId: 0, sysUiSessionId: -1877024172
01-02 06:47:13.315  2405  2405 D BiometricPrompt/AuthController: userId: 0 savedState: null mCurrentDialog: null newDialog: com.android.systemui.biometrics.AuthContainerView{df5e4fc VFE...... .F....I. 0,0-0,0} type: 0 sysUiSessionId: -1877024172
01-02 06:47:13.346  6128  6128 D tctsidebar: TctSideBarService   :onChange listening package tag : 1 , com.android.systemui/BiometricPrompt
01-02 06:47:13.766 10201 10733 W PlayCommon: [87] alsu.a(7): No account for auth token provided01-02 06:47:15.725   991  2850 D LockSettingsService: spBasedDoVerifyCredential: user=0 challengeType=0 hasEnrolledBiometrics=true
01-02 06:47:15.872  1150  1150 D keystore: AddAuthenticationToken: timestamp = 11125713, time_received = 3623
01-02 06:47:16.014  1150  1150 D keystore: AddAuthenticationToken: timestamp = 11125856, time_received = 3623
01-02 06:47:16.111  1150  1150 D keystore: AddAuthenticationToken: timestamp = 11125952, time_received = 3623
01-02 06:47:16.118   991   991 D FingerprintService: setActiveUser(0)
01-02 06:47:16.131  1434  1434 D talog   : V [gf_fpcore_common][gf_fpcore_get_authenticator_id] enter
01-02 06:47:16.131  1434  1434 D talog   : V [gf_fpcore_common][gf_fpcore_get_authenticator_id] exit
01-02 06:47:16.138   991   991 W AlarmManager: Unrecognized alarm listener com.android.server.locksettings.LockSettingsStrongAuth$NonStrongBiometricIdleTimeoutAlarmListener@15dac89
01-02 06:47:16.504  2405  2405 D BiometricPrompt/AuthContainerView: pendingCallback: 7 sysUISessionId: -1877024172
01-02 06:47:16.505  2405  2405 D BiometricPrompt/AuthController: onDialogDismissed: 7
01-02 06:47:16.505  2405  2405 D BiometricPrompt/AuthContainerView: Removing container, mSysUiSessionId: -1877024172
01-02 06:47:16.507  1150  1150 D keystore: AddAuthenticationToken: timestamp = 11125952, time_received = 3624
01-02 06:47:16.508   991   991 E BiometricService: mTokenEscrow is null
01-02 06:47:16.509  5689  5707 D activity1: showLockScreen: xxx

4)设置BiometricManager.Authenticators.DEVICE_CREDENTIAL | BiometricManager.Authenticators.BIOMETRIC_WEAK
弹指纹验证窗口(如果有指纹),无指纹则直接弹密码验证弹框。


【小结】
Android R开始,@Deprecated API setDeviceCredentialAllowed(true)仍然有效,不会导致程序异常,不推荐使用。
API30推荐的替换API setAllowedAuthenticators(int)。
但是需要注意,传入参数必须至少有BiometricManager.Authenticators.DEVICE_CREDENTIAL,否则程序抛异常。
如果还想生物识别 指纹验证方式,最少需要需要传入:BiometricManager.Authenticators.DEVICE_CREDENTIAL | BiometricManager.Authenticators.BIOMETRIC_WEAK。


更正结论,

并非一定要申请DEVICE_CREDENTIAL, 如果单独申请BIOMETRIC_WEAK也不是不行,但是要同步配合多设置参数,比如:error log里边提示的, 原来默认左边negative button是跳转到验证设备密码界面,但是不申请密码了. 这样程序不知道该如何处理,需要自身指定该行为,比如取消验证之类的.

报错log:

06-15 20:37:02.809 22329 22329 D AndroidRuntime: Shutting down VM
06-15 20:37:02.810 22329 22329 E AndroidRuntime: FATAL EXCEPTION: main
06-15 20:37:02.810 22329 22329 E AndroidRuntime: Process: com.start.testdemo, PID: 22329
06-15 20:37:02.810 22329 22329 E AndroidRuntime: java.lang.IllegalArgumentException: Negative text must be set and non-empty
06-15 20:37:02.810 22329 22329 E AndroidRuntime:        at android.hardware.biometrics.BiometricPrompt$Builder.build(BiometricPrompt.java:483)
06-15 20:37:02.810 22329 22329 E AndroidRuntime:        at com.start.testdemo.ui.activity.BiometricPromptActivity.startBPUI(BiometricPromptActivity.java:91)
06-15 20:37:02.810 22329 22329 E AndroidRuntime:        at com.start.testdemo.ui.activity.BiometricPromptActivity.access$000(BiometricPromptActivity.java:26)
06-15 20:37:02.810 22329 22329 E AndroidRuntime:        at com.start.testdemo.ui.activity.BiometricPromptActivity$2.run(BiometricPromptActivity.java:76)
06-15 20:37:02.810 22329 22329 E AndroidRuntime:        at android.os.Handler.handleCallback(Handler.java:958)
06-15 20:37:02.810 22329 22329 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:99)
06-15 20:37:02.810 22329 22329 E AndroidRuntime:        at android.os.Looper.loopOnce(Looper.java:257)
06-15 20:37:02.810 22329 22329 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:368)
06-15 20:37:02.810 22329 22329 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:8826)
06-15 20:37:02.810 22329 22329 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
06-15 20:37:02.810 22329 22329 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:572)
06-15 20:37:02.810 22329 22329 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049)
06-15 20:37:02.842  1785  3983 W ActivityTaskManager:   Force finishing activity com.start.testdemo/.ui.activity.BiometricPromptActivity
06-15 20:37:02.844  1785  3983 D ActivityTaskManager: setVisibility(Token{3c646e1 ActivityRecord{970a2eb u0 com.start.testdemo/.ui.activity.BiometricPromptActivity t3712 f}}}, visible=false) defer commitVisibility for transition collecting

正确用法:

biometricPrompt = new BiometricPrompt.Builder(this).setTitle(getString(R.string.start_biometric_prompt_ui_title))//.setAllowedAuthenticators(BiometricManager.Authenticators.BIOMETRIC_WEAK | BiometricManager.Authenticators.DEVICE_CREDENTIAL).setAllowedAuthenticators(BiometricManager.Authenticators.BIOMETRIC_WEAK).setNegativeButton(......).build();

正确输出的log如下:

06-15 20:54:57.006 25595 25595 D BPUIActivity: startBpUI: start BP UI
06-15 20:54:57.007 25595 25595 D BPUIActivity: startBpUI: Android API:34
06-15 20:54:57.012  1785  3190 E OplusCustomizeRestrictionManagerService: isBiometricDisabled start
06-15 20:54:57.013  1785  3190 E OplusCustomizeRestrictionManagerService: isBiometricDisabled start
06-15 20:54:57.015  1785  3190 E OplusCustomizeRestrictionManagerService: isBiometricDisabled start
06-15 20:54:57.015  1785  3190 D BiometricService/PreAuthInfo: Package: com.start.testdemo Sensor ID: 4 Modality: 8 Status: 1
06-15 20:54:57.015  1785  3190 E OplusCustomizeRestrictionManagerService: isBiometricDisabled start
06-15 20:54:57.015  1785  3190 D BiometricService/PreAuthInfo: Package: com.start.testdemo Sensor ID: 0 Modality: 2 Status: 7
06-15 20:54:57.015  1785  3190 D BiometricService/PreAuthInfo: getCanAuthenticateInternal Modality: 8 AuthenticatorStatus: 1
06-15 20:54:57.015  1785  3190 D BiometricService: handleAuthenticate: modality(8), status(0), preAuthInfo: BiometricRequested: true, StrengthRequested: 255, CredentialRequested: false, Eligible:{4 }, Ineligible:{ID(0), oemStrength: 15, updatedStrength: 15, modality 2, state: 4, cookie: 1593309045:7 }, CredentialAvailable: true,  requestId: 48 promptInfo.isIgnoreEnrollmentState: false
06-15 20:54:57.015  1785  3190 D BiometricService: Creating authSession with authRequest: BiometricRequested: true, StrengthRequested: 255, CredentialRequested: false, Eligible:{4 }, Ineligible:{ID(0), oemStrength: 15, updatedStrength: 15, modality 2, state: 4, cookie: 1593309045:7 }, CredentialAvailable: true, 
06-15 20:54:57.015  1785  3190 D BiometricService/AuthSession: Creating AuthSession with: BiometricRequested: true, StrengthRequested: 255, CredentialRequested: false, Eligible:{4 }, Ineligible:{ID(0), oemStrength: 15, updatedStrength: 15, modality 2, state: 4, cookie: 1593309045:7 }, CredentialAvailable: true, 
06-15 20:54:57.015  1785  3190 V BiometricService/AuthSession: set to unknown state sensor: 4
06-15 20:54:57.016  1785  3190 V BiometricService/AuthSession: waiting for cooking for sensor: 4
06-15 20:54:57.018  1785  3190 D UaBiometricScheduler/FaceProvider/default/4: [Added] {[1259] com.android.server.biometrics.sensors.face.aidl.FaceAuthenticationClient, proto=3, owner=com.start.testdemo, cookie=1667886681, requestId=48, userId=0}, new queue size: 1
06-15 20:54:57.379  1785  3190 D BiometricService: handleOnDialogAnimatedIn
06-15 20:54:57.398  3378  3378 V OplusAuthBiometricView: newState: 2
06-15 20:54:57.398  3378  3378 V OplusAuthBiometricView: isDeviceCredentialAllowed=: false
06-15 20:54:57.398  3378  3378 V OplusAuthBiometricView: mRequireConfirmation=: true
06-15 20:54:57.420  2311 27850 E face_aidl.ImageReaderHelper: wake verify thread
06-15 20:54:57.421  2311  3216 I face_aidl.AlgoEngine: startAuthenticate, authType =0

这才符合三方APP的使用需要, 公司APP不可能把鉴权验证交给设备密码.

这篇关于BiometricPrompt.Builder.setDeviceCredentialAllowed(boolean)方法过时了,怎么破。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141574

相关文章

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu