Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562

Не получается использовать сенсор отпечатка пальца

09.02.2019, 20:10. Показов 885. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь использовать сенсор отпечатка пальца. Но что-то не работает.
1) Манифест, прописал разрешения устаревшего fingerprint и нового biometric.
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.test">
 
   <uses-permission android:name="android.permission.USE_BIOMETRIC"/>
   <uses-permission android:name="android.permission.USE_FINGERPRINT"/>
 
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>
2) Разметка активности. Всего один слой.
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/activity_background"
    android:orientation="vertical">
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="@style/String24SP"
        android:text="@string/test_biometr"/>
 
    <ImageView
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center"
        android:paddingTop="25dp"
        android:src="@mipmap/biometr"/>
 
    <TextView
        android:id="@+id/ErrorTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""
        android:layout_gravity="center"
        android:textColor="@color/red_color"
        android:paddingTop="15dp"/>
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="@style/String15SP"
        android:text="@string/short_instuction"/>
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="@style/Stirng15SP_LightBlue"
        android:text="@string/warring_information" />
 
</LinearLayout>
3) Создал класс, который обрабатывает прикосновения с сенсору, и если все хорошо, выдает сообщение об успешном завершении.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class HandlerFingerPrint extends FingerprintManager.AuthenticationCallback {
    private Context context;
 
    public HandlerFingerPrint(Context context){
        this.context = context;
    }
 
    public void startAuth (FingerprintManager manager, FingerprintManager.CryptoObject cryptoObject){
        CancellationSignal cancellationSignal = new CancellationSignal();
        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.USE_FINGERPRINT) == PackageManager.PERMISSION_GRANTED)
            return;
 
        manager.authenticate(cryptoObject, cancellationSignal, 0, this, null);
    }
 
 
    @Override
    public void onAuthenticationError(int errorCode, CharSequence errString) {
        this.update(errString.toString());
    }
 
    @Override
    public void onAuthenticationHelp(int helpCode, CharSequence helpString) {
        this.update(helpString.toString());
    }
 
    @Override
    public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
        this.update("Succeful!");
    }
 
    @Override
    public void onAuthenticationFailed() {
        this.update("Failed!");
    }
 
    public void update (String str){
        TextView textView =  (TextView)((Activity)context).findViewById(R.id.ErrorTextView);
        textView.setText(str);
    }
}
4) Главный класс
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
public class MainActivity extends AppCompatActivity {
    private String AndroidKeyStore = "AndroidKeyStore";
    private String KEY_NAME = "Ebound";
    private FingerprintManager fingerprintManager;
    private KeyguardManager keyguardManager;
    private KeyStore keyStore;
    private KeyGenerator keyGenerator;
    private Cipher cipher;
    private FingerprintManager.CryptoObject cryptoObject;
 
    private TextView errorTextView;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        errorTextView = (TextView)findViewById(R.id.ErrorTextView);
 
        keyguardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);
        fingerprintManager = (FingerprintManager)getSystemService(FINGERPRINT_SERVICE);
 
        if (!fingerprintManager.isHardwareDetected()){
            errorTextView.setText("Hardware error");
        } else {
            if (!fingerprintManager.hasEnrolledFingerprints()){
                errorTextView.setText("You need to register new fingerprint");
            } else {
                if (!keyguardManager.isKeyguardSecure()){
                    errorTextView.setText("Please enable lock screen security in setting");
                } else {
                    generateKey();
                    if (cipherInit()){
                        cryptoObject = new FingerprintManager.CryptoObject(cipher);
                        HandlerFingerPrint handlerFingerPrint = new HandlerFingerPrint(this);
                        handlerFingerPrint.startAuth(fingerprintManager, cryptoObject);
                    }
                }
            }
        }
    }
 
 
    @TargetApi(Build.VERSION_CODES.M)
    protected void generateKey (){
        try {
            keyStore = KeyStore.getInstance(AndroidKeyStore);
        } catch (Exception ex){
            errorTextView.setText(AndroidKeyStore + " error!");
        }
 
        KeyGenerator keyGenerator = null;
 
        try {
            keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, AndroidKeyStore);
        } catch (NoSuchAlgorithmException | NoSuchProviderException ex){
            errorTextView.setText("KeyGenerator error!");
        }
 
        try {
          keyStore.load(null);
          keyGenerator.init(new
                  KeyGenParameterSpec.Builder(KEY_NAME, KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT)
                  .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                  .setUserAuthenticationRequired(true)
                  .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
                  .build());
          keyGenerator.generateKey();
        } catch (InvalidAlgorithmParameterException | IOException | NoSuchAlgorithmException | CertificateException ex){
            errorTextView.setText("KeyGenerator error");
        }
    }
 
    @TargetApi(Build.VERSION_CODES.M)
    public boolean cipherInit (){
        try {
            cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException ex){
            errorTextView.setText("cipher error");
        }
 
        try {
            keyStore.load(null);
            SecretKey key = (SecretKey) keyStore.getKey(KEY_NAME,
                    null);
            cipher.init(Cipher.ENCRYPT_MODE, key);
            return true;
        } catch (KeyPermanentlyInvalidatedException e) {
            return false;
        } catch (KeyStoreException | UnrecoverableKeyException | IOException | NoSuchAlgorithmException | InvalidKeyException e) {
            throw new RuntimeException("Failed to init Cipher", e);
        } catch (java.security.cert.CertificateException e) {
            e.printStackTrace();
        }
        return false;
    }
}
При установке на девайс, приложение просто устанавливается и не запрашивает никаких разрешений.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.02.2019, 20:10
Ответы с готовыми решениями:

Распознавание отпечатка пальца
Всем привет. Мне нужна небольшая помощь, нужно для микроконтроллера реализовать микросхему распознавания отпечатка пальца, находил...

Lenovo Fingerprint обойти сканирование отпечатка пальца
Всем привет! Кто подскажет как обойти сканирование отпечатка пальца на ibm &quot;x&quot;, если допустим порезал палец?

Сканер отпечатка пальца 4500 Fingerprint Reader
Здравствуйте! Не разобрался к какому разделу это отнести и решил написать сюда Кто-то пользовался такой штукой? ...

4
111 / 89 / 29
Регистрация: 07.01.2017
Сообщений: 456
13.02.2019, 09:10
Photofenix, так а какое разрешение оно должно запросить?
0
 Аватар для Роман Попов
9 / 11 / 2
Регистрация: 24.11.2017
Сообщений: 74
15.02.2019, 18:09
Photofenix, Попробуйте продебажить приложение, добавьте блоки if на проверку наличия сенсора отпечатка пальца на девайсе и посмотрите лог. Это должно дать какую-нибудь информацию
0
2 / 2 / 3
Регистрация: 30.07.2013
Сообщений: 48
17.05.2019, 10:00
Не знаю, актуально ли еще, но, возможно, ответ найдется в примере с сайта developer.android.com:

Example: RSA key pair for signing/verification using PKCS#1 padding
This example illustrates how to import an RSA key pair into the Android KeyStore under alias key2 with the private key authorized to be used only for signing using the PKCS#1 signature padding scheme with SHA-256 digest and only if the user has been authenticated within the last ten minutes. The use of the public key is unrestricted (see Known Issues). Both the private and the public key must export their key material via Key#getEncoded() in PKCS#8 and X.509 format respectively.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
PrivateKey privateKey = ...;   // RSA private key
  Certificate[] certChain = ...; // Certificate chain with the first certificate
                                 // containing the corresponding RSA public key.
 
  KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
  keyStore.load(null);
  keyStore.setEntry(
          "key2",
          new KeyStore.PrivateKeyEntry(privateKey, certChain),
          new KeyProtection.Builder(KeyProperties.PURPOSE_SIGN)
                  .setDigests(KeyProperties.DIGEST_SHA256)
                  .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
                  // Only permit this key to be used if the user
                  // authenticated within the last ten minutes.
                  .setUserAuthenticationRequired(true)
                  .setUserAuthenticationValidityDurationSeconds(10 * 60)
                  .build());
  // Key pair imported, obtain a reference to it.
  PrivateKey keyStorePrivateKey = (PrivateKey) keyStore.getKey("key2", null);
  PublicKey publicKey = keyStore.getCertificate("key2").getPublicKey();
  // The original private key can now be discarded.
 
  Signature signature = Signature.getInstance("SHA256withRSA");
  signature.initSign(keyStorePrivateKey);
  ...
0
5 / 4 / 1
Регистрация: 15.12.2015
Сообщений: 255
17.05.2019, 10:21
Полно готовых решений, используй одно из них
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.05.2019, 10:21
Помогаю со студенческими работами здесь

Android Studio Kotlin Сканер отпечатка пальца
Нужно создать самое просто приложение на отпечаток

Не получается использовать :before
Всем доброго времени суток! У меня есть блок (long) в нем картинка () и хочу поставить за этой картинкой еще одну, как фон, чтобы красиво...

Не получается использовать solve().
Здравствуйте, недавно столкнулся с необходимостью освоения Matlab, так что владею пока им на уровне пещерного человека... возникла...

Не получается использовать getcursor
Я скачал с офсайта среду, но при попытке использовать getcursor вываливается предупреждение что нельзя использовать в demo версии это. ...

Не получается использовать анимацию JS
Хотел чтоб надпись &quot;обзор БК&quot; двигалась(вместо анимации CSS пробую анимацию JS) но почему то не получается,кто знает почему? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru