Я использую метод биометрии c, чтобы разблокировать мое приложение. Но если пользователь отключил отпечаток пальца или пользователь использует устройство, которое не поддерживает отпечаток пальца, как я могу использовать для них проверку подлинности с помощью пин-кода или шаблона.
Я использовал keyguardmanager раньше, в 2018 году, и у меня сработало, что если у пользователя нет настроек отпечатка пальца или нет аппаратного обеспечения для снятия отпечатков пальцев, диспетчер клавиатуры автоматически запрашивает другой метод аутентификации по умолчанию. Я хочу использовать то же самое здесь.
Это код, который я использую в xamarin. android.
public void SetAuth()
{
try
{
KeyguardManager keyguardManager = (KeyguardManager)Activity.GetSystemService(Service.KeyguardService);
BiometricPrompt biometricManager = new BiometricPrompt.Builder(Activity)
.SetDescription("Authorization required to access data")// TODO:
.SetTitle("Access Data")// TODO:
.SetNegativeButton("Cancel", Activity.MainExecutor, this)
.SetSubtitle("").Build();//(BiometricPrompt)Activity.GetSystemService(Service.FingerprintService);
if (ActivityCompat.CheckSelfPermission(Activity, Manifest.Permission.UseBiometric)
!= (int)Android.Content.PM.Permission.Granted)
{
ActivityCompat.RequestPermissions(Activity, new string[] { Manifest.Permission.UseBiometric }, 1);
return;
}
if (!keyguardManager.IsKeyguardSecure)
{
Helper.DialogBox(Activity, Activity.ApplicationContext, "Lock screen security not enable in Settings", null);
}
else
GenKey();
if (CipherInit())
{
BiometricPrompt.CryptoObject cryptoObject = new BiometricPrompt.CryptoObject(cipher);
FingerprintHandler handler = new FingerprintHandler(Activity, this);
handler.StartAuthentication(biometricManager, cryptoObject);
}
}
catch (System.Exception ex)
{
ErrorLog(Params.Main_error, ex.Message + " :: " + ex.StackTrace, Params.AppInternalIssue_code);
}
}
private bool CipherInit()
{
try
{
cipher = Cipher.GetInstance(KeyProperties.KeyAlgorithmAes
+ "/"
+ KeyProperties.BlockModeCbc
+ "/"
+ KeyProperties.EncryptionPaddingPkcs7);
keyStore.Load(null);
IKey key = (IKey)keyStore.GetKey(KEY_NAME, null);
cipher.Init(CipherMode.EncryptMode, key);
return true;
}
catch (System.Exception ex) {
return false;
}
}
private void GenKey()
{
keyStore = KeyStore.GetInstance("AndroidKeyStore");
KeyGenerator keyGenerator = null;
keyGenerator = KeyGenerator.GetInstance(KeyProperties.KeyAlgorithmAes, "AndroidKeyStore");
keyStore.Load(null);
keyGenerator.Init(new KeyGenParameterSpec.Builder(KEY_NAME, KeyStorePurpose.Encrypt | KeyStorePurpose.Decrypt)
.SetBlockModes(KeyProperties.BlockModeCbc)
.SetUserAuthenticationRequired(true)
.SetEncryptionPaddings(KeyProperties
.EncryptionPaddingPkcs7).Build());
keyGenerator.GenerateKey();
}