Suche
Highlights in Android Marshmallow - Teil 4

Fingerprint-Sensor in Android: Das müssen Entwickler wissen

Michael Gruczel
Android-Marshmallow-e1446028571110-300x253

©Shutterstock / Asif Islam

Mit diesem Beitrag findet die Serie um spannende Neuerungen in Android Marshmallow mit einem Ausblick auf das neue Fingerabdruck API und Hinweisen zu weiteren kleineren Neuerungen einen Abschluss.

Was hat es mit der Fingerabdruck Authentifizierung auf sich?

Mit Android 23 kommt die Fingerabdruckunterstützung als Teil des SDKs. Gerade auf Smartphones ist die Eingabe von Passwörtern besonders umständlich, da bei sicheren Passwörtern nicht selten zwischen Groß-, Kleinschreibung und Sonderzeichen gewechselt werden muss und dabei gerne mal das falsche Zeichen angetippt wird. Die Authentifizierung mittels Fingerabdruck verspricht hier Abhilfe. Die Fingerabdruckfunktionalität existierte bereits in verschiedenen von Herstellern angepassten Versionen, wird jetzt aber zu einem festen Bestandteil von Android.

Einige Einschränkungen gibt es dennoch. Das Ganze funktioniert logischerweise nur auf Geräten mit einer entsprechenden Hardwareunterstützung. Leider ist die Verbreitung von solchen Geräten derzeit noch sehr gering, so dass wir vermutlich noch eine Weile warten müssen, bis der Fingerabdruck das Passwort ersetzen wird. Da die Fingerabdrucksensoren zum Teil eine nur sehr niedrige Auflösung haben, werden möglicherweise zudem Fragen zur Sicherheit aufkommen.

Die Anwendung im Code ist dafür relativ einfach, so dass nichts dagegen sprechen sollte, dem Anwender diese Funktionalität zumindest anzubieten. Um die Authentifizierung anzustoßen, reicht ein Aufruf der Methode authenticate() auf einer Instanz eines FingerprintManagers. Dieser kann zum Beispiel über den Context einer Activity geholt werden. Der FingerprintManager verrät dem Entwickler auch, ob das Gerät über eine Fingerabdruckunterstützung verfügt und ob Fingerabdrücke hinterlegt sind.

Der FingerprintManager erwartet einen Callback, der das Ergebnis der Prüfung verarbeiteten kann. Zudem bedarf es eines CryptoObjects, welches den Fingeradruck verschlüsseln und entschlüsseln kann. Listing 1 zeigt ein vereinfachtes Beispiel.

...
public class SampleActivity extends Activity  {

    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
    }

    @OnClick(R.id.login)
    public void submit() {
        // user clicked on login
        if (Build.VERSION.SDK_INT >= 23) {
            // we have a marshmallow device
            FingerprintManager fingerprintMng
                      = getSystemService(FingerprintManager.class);

            if (checkSelfPermission(Manifest.permission.USE_FINGERPRINT)
                  == PackageManager.PERMISSION_GRANTED
                  && fingerprintMng.isHardwareDetected()
                  && fingerprintMng.hasEnrolledFingerprints()) {
                // permission is already given and device has stored
                // fingerprints
                Cipher aCypher = ...
                FingerprintHelper aCallback = new FingerprintHelper(this);
                Toast.makeText(this,
                    "Fingerabdruck bitte", Toast.LENGTH_LONG).show();
                fingerprintMng.authenticate(
                           new FingerprintManager.CryptoObject(aCypher),
                           new CancellationSignal(), 0 /* flags */,
                           aCallback, null);
            } else {
                // not permission for fingerprint or no hardware support
                // or no stored fingerprints, skip check
                loginValid();
            }
        } else {
            // not marshmallow, skip check
            loginValid();
        }
    }

    public void loginValid() {
        // execute logic here
    }

     public void showError(String error) {
        Toast.makeText(this, "error : " + error, Toast.LENGTH_LONG).show();
    }

}

In diesem Beispiel wird nach dem Klick auf login die Fingerabdruckprüfung angestoßen, sofern es sich um Marshmallow handelt, die Berechtigung zur Nutzung des Fingerandrucks gegeben ist, das Gerät die Funktionalität unterstützt und Fingerabdrücke abgespeichert sind. In jedem anderen Fall wird in diesem Beispiel die Authentifizierung einfach übersprungen. Dem FingerprintManager wird dabei ein Callback mitgegeben. Hierbei handelt es sich um die Klasse in Listing 2. Diese nimmt die Ergebnisse entgegen und ruft dazu passende Methoden innerhalb er Activity auf.

...
public class FingerprintHelper extends FingerprintManager.AuthenticationCallback {

    SampleActivity activity;

    public FingerprintHelper(SampleActivity activity) {
        this.activity = activity;
    }

    public void onAuthenticationError(int errorCode, CharSequence errString) {
        activity.showError("onAuthenticationError " + errString + " " + errorCode);
    }

    public void onAuthenticationSucceeded(AuthenticationResult result) {
        activity.loginValid();
    }

    public void onAuthenticationFailed() {
        activity.showError("onAuthenticationFailed");
    }

}

In einer echten Anwendung würde dieses Beispiel vermutlich etwas eleganter ausgebaut werden. So würde der Entwickler vermutlich neben dem asynchronen Aufruf der Authentifizierung auf dem FingerprintManager (authenticate) noch einen schönen Dialog einbauen, um den Anwender zu informieren. Im Falle einer fehlenden Fingerabruckunterstützung würde an dieser Stelle eventuell ein Passwort abgefragt werden, anstatt die Prüfung einfach zu überspringen. Die asynchrone Verarbeitung der Authentifizierung würde vermutlich innerhalb eines MVP-Patterns abgebildet werden. Zudem muss die Berechtigung der Fingerprintfunktionalität gemäß des neuen Berechtigungskonzept in Marshmallow zunächst auch noch angefragt werden.

Hat man die Fingerabdruckunterstützung in seine Anwendung eingebaut, so muss diese noch getestet werden. Aufgrund der geringen Verbreitung von Smartphones mit Fingerabruckunterstützung steht dem Entwickler möglicherweise kein Gerät zum Testen zur Verfügung. Hier kann der Emulator genutzt werden. Dazu hinterlegt man zunächst innerhalb der Sicherheitseinstellungen einen Fingerabdruck. Dann kann die  Authentifizierung über die Kommandozeile ausgeführt werden.

$ adb devices -l
## adb -s <device> emu finger touch <Abdruck>
## z.B.
$ adb -s emulator-5554 emu finger touch 1

Die Initialisierung eines Cyphers mit den dafür notwendigen Abhängigkeiten habe ich in diesem Beispiel vernachlässigt, da man dies nur einmal machen muss und die Logik leicht über eine Dependency Injection (zum Beispiel Dagger) entkoppeln kann. Ein entsprechend erweitertes Beispiel von Google kann unter [1] gefunden werden.

Fazit

Diese Reihe hat einige Neuerungen in Android Marshmallow angerissen und mit kleinen Beispielen hoffentlich etwas anschaulicher gemacht. Dabei habe ich mich auf die nach meiner Meinung spannendsten Neuerungen beschränkt und somit keinerlei Anspruch auf vollständig erhoben. Dem neugierigen Leser empfehle ich noch ein Blick auf zwei weitere Neuerungen:

Mit Android Marshmallow kommt ein Assistent, der mit einem langen Druck auf den Home-Button aufgerufen werden kann. Dieser bietet dem Anwender automatisch Aktionen zum aktuellen Kontext. Mittels des Assist APIs kann der Entwickler nun dieses Verhalten genauer konfigurieren, indem etwa dem Assistenten bestimmte Informationen zur Verfügung gestellt werden oder auch die Nutzung einschränkt wird (näheres siehe [2]).

Mit dem verbesserten Handling von App Links wird ein eleganteres Deeplinking ermöglicht. Ersichtlich wird dies dem Anwender zunächst dadurch, dass sich eine Anwendung bei Aufruf eines Links direkt öffnet, also ohne dass der Anwender in einem Dialog nach Erlaubnis gefragt wird. Dafür muss auf dem Server eine JSON-Datei mit einige Meta-Informationen abgelegt werden und die App entsprechend instrumentiert werden (näheres siehe [3]).

Highlights in Android Marshmallow
Teil 1: Berechtigungskonzept in Android Marshmallow: Das müssen Entwickler wissen
Teil 2: Doze und App Standby in Android Marshmallow: Das müssen Entwickler wissen
Teil 3: Autobackup in Android Marshmallow: Das müssen Entwickler wissen
Teil 4: Fingerprint-Sensor in Android Marshmallow: Das müssen Entwickler wissen

Aufmacherbild: Mountain View von Shutterstock / Urheberrecht: Asif Islam

Geschrieben von
Michael Gruczel
Michael Gruczel
Michael Gruczel ist seit 2008 als Berater und Entwickler im Bereich Java tätig. Innerhalb des Team mobile Apps entwickelt er in der Firma eSailors IT solutions GmbH Android und iOS Apps. Dazu gehört sowohl die Entwicklung, das Testen, das Veröffentlichen als auch das Betreiben.
Kommentare

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *