5

Sto cercando di iniziare con l'API Marshmallow Fingerprint Authentication. Capisco che a chiedere il permesso, devo utilizzare il seguente metodo:Marshmallow Fingerprint Scanner Hardware Presenza

ContextCompat.checkSelfPermission(getContext(), Manifest.permission.USE_FINGERPRINT); 

E devo controllare se il dispositivo è in funzione API di livello 23 o superiore. Ma prima di chiedere il permesso, vorrei verificare se il dispositivo ha effettivamente uno scanner di impronte digitali per cominciare. Ho trovato i seguenti due metodi per fare questo controllo:

FingerprintManager manager = (FingerprintManager) getSystemService(Context.FINGERPRINT_SERVICE); 

manager.isHardwareDetected(); 

manager.hasEnrolledFingerprints(); 

Ma Entrambi i metodi richiedono USE_FINGERPRINT il permesso di essere chiamato a tutti. Perché dovrei chiedere il permesso di utilizzare uno scanner di impronte digitali che non conosco nemmeno esiste? Esistono altri metodi per scoprire se esiste uno scanner? O è l'unico modo per chiedere il permesso prima?

+1

'USE_FINGERPRINT' è un permesso normale - una volta che è nel vostro manifesto avrete sempre e non c'è bisogno di usare' ContextCompat.checkSelfPermission() '. – ianhanniballake

+0

@ianhanniballake Oh, sembra vero. Perché allora lancia un 'SecurityException'? Non dovrebbe essere solo un errore del compilatore o qualcosa del genere? Anche il 'VIBRATOR_SERVICE' richiede un permesso normale e non genera eccezioni. – Bryan

risposta

9

Ho appena trovato la classe FingerprintManagerCompat, che fa esattamente quello che ci si aspetta:

Una classe che coordina l'accesso all'hardware di impronte digitali.

Sulle piattaforme prima di M, questa classe si comporta come non ci sarebbe hardware di impronte digitali disponibile.

Gli stessi metodi di FingerprintManager in questa classe non richiedono il permesso USE_FINGERPRINT, consentendo di chiamare loro prima di chiedere il permesso USE_FINGERPRINT.

FingerprintManagerCompat manager = FingerprintManagerCompat.from(mContext); 

manager.isHardwareDetected(); 
manager.hasEnrolledFingerprints(); 

Questi metodi forniranno anche i risultati falsi attesi sui dispositivi pre-Marshmallow.

4

Try hasSystemFeature(PackageManager.FEATURE_FINGERPRINT) su un'istanza PackageManager (è possibile ottenerne uno chiamando il numero getPackageManager() su qualsiasi utile Context).

+0

Questo sembra promettente, ma sono un po 'cauto considerando che questo metodo non richiede il livello API 23. Restituisce vero se il dispositivo ha uno scanner pre-Marshmallow (ad esempio, su un dispositivo Samsung) o uno scanner che non è interoperabile con l'API di autenticazione delle impronte digitali? Se è così, allora su quei dispositivi sarei nella stessa situazione in cui mi trovo ora. – Bryan

+1

@Bryan: "Sono un po 'diffidente considerando che questo metodo non richiede il livello API 23" - il metodo no, ma 'FEATURE_FINGERPRINT'. Chiamalo solo su dispositivi API Level 23+; Non ho idea di cosa succede se passi un nome di funzione non riconosciuto a 'hasSystemFeature()'. – CommonsWare

+1

@Bryan: "o uno scanner che non è interoperabile con l'API di autenticazione delle impronte digitali?" - Non posso dire. Ecco a cosa servono i metodi 'FingerprintManager'. Il tuo obiettivo dovrebbe essere quello di filtrare i casi in cui chiaramente non è necessario il permesso 'USE_FINGERPRINT'. Se è pensabile che tu abbia la capacità di impronte digitali, quindi chiedere il permesso e riconfermare la disponibilità con 'FingerprintManager'. – CommonsWare

1

FingerprintManager classe supporta dispositivi Android in esecuzione su API 23 o superiore e genera un'eccezione su dispositivi che eseguono versioni di Android inferiori.

FingerprintManagerCompat classe dare retrocompatibilità di isHardwareDetected metodo inferiore Versione Android ma restituisce sempre false per API 23 o superiore

ho preso meglio di entrambi e ho creato questo metodo per verificare la presenza di hardware sensore di impronte digitali supporto in tutta la versione Android.

private boolean isSensorAvialable() { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      return ActivityCompat.checkSelfPermission(AppContext, Manifest.permission.USE_FINGERPRINT) == PackageManager.PERMISSION_GRANTED && 
        AppContext.getSystemService(FingerprintManager.class).isHardwareDetected(); 
     } else { 
      return FingerprintManagerCompat.from(AppContext).isHardwareDetected(); 
     } 
    }