예제 #1
0
        /// <summary>
        ///     Gets the device's current biometric capabilities.
        /// </summary>
        /// <returns>A <see cref="BiometryCapabilities" /> struct instance.</returns>
        public Task <BiometryCapabilities> GetCapabilities()
        {
            bool _isEnabled = false;

            switch (_biometricManager.CanAuthenticate(BiometricManager.Authenticators.BiometricStrong))
            {
            case BiometricManager.BiometricSuccess:
                _isEnabled = true;
                break;

            case BiometricManager.BiometricErrorNoHardware:
                _isEnabled = false;
                break;

            case BiometricManager.BiometricErrorNoneEnrolled:
                _isEnabled = false;
                break;

            case BiometricManager.BiometricErrorSecurityUpdateRequired:
                _isEnabled = false;
                break;

            default:
                break;
            }
            bool devicePinAvailable = Convert.ToBoolean(_biometricManager.CanAuthenticate(BiometricManager.Authenticators.DeviceCredential));

            return(Task.Run(() =>
            {
                return new BiometryCapabilities(BiometryType.FaceOrFingerprint, _isEnabled, devicePinAvailable);
            }));
        }
예제 #2
0
        private FingerprintAvailability GetBiometricAvailability()
        {
            var context = Application.Context;

            if (context.CheckCallingOrSelfPermission(Manifest.Permission.UseBiometric) != Permission.Granted &&
                context.CheckCallingOrSelfPermission(Manifest.Permission.UseFingerprint) != Permission.Granted)
            {
                return(FingerprintAvailability.NoPermission);
            }

            var result = _manager.CanAuthenticate();

            switch (result)
            {
            case BiometricManager.BiometricErrorNoHardware:
                return(FingerprintAvailability.NoSensor);

            case BiometricManager.BiometricErrorHwUnavailable:
                return(FingerprintAvailability.Unknown);

            case BiometricManager.BiometricErrorNoneEnrolled:
                return(FingerprintAvailability.NoFingerprint);

            case BiometricManager.BiometricSuccess:
                return(FingerprintAvailability.Available);
            }

            return(FingerprintAvailability.Unknown);
        }
예제 #3
0
        public FingerprintService(
            FragmentActivity fragmentActivity,
            Context applicationContext,
            IObservable <Unit> applicationActivated,
            CoreDispatcher dispatcher,
            IScheduler backgroundScheduler,
            FuncAsync <BiometricPrompt.PromptInfo> promptInfoBuilder)
        {
            fragmentActivity.Validation().NotNull(nameof(fragmentActivity));
            applicationActivated.Validation().NotNull(nameof(applicationActivated));
            backgroundScheduler.Validation().NotNull(nameof(backgroundScheduler));
            _dispatcher        = dispatcher ?? throw new ArgumentNullException(nameof(dispatcher));
            _promptInfoBuilder = promptInfoBuilder ?? throw new ArgumentNullException(nameof(promptInfoBuilder));

            var executor = ContextCompat.GetMainExecutor(applicationContext);
            var callback = new AuthenticationCallback(OnAuthenticationSucceeded, OnAuthenticationFailed, OnAuthenticationError);

            _BiometricPrompt  = new BiometricPrompt(fragmentActivity, executor, callback);
            _BiometricManager = BiometricManager.From(Application.Context);

            _keyStore = KeyStore.GetInstance(ANDROID_KEYSTORE);
            _keyStore.Load(null);

            _canAuthenticate =
                applicationActivated
                .ObserveOn(backgroundScheduler)
                .StartWith(backgroundScheduler, Unit.Default)
                .Select(_ => _BiometricManager.CanAuthenticate())
                .Replay(1, backgroundScheduler)
                .RefCount();
        }