# Mit einem Lesegerät verbinden Verbinden Sie Ihre Anwendung mit einem Stripe Terminal-Lesegerät. > Wenn Sie sich noch nicht für ein Lesegerät entschieden haben, vergleichen Sie die verfügbaren [Terminal-Lesegeräte](https://docs.stripe.com/terminal/payments/setup-reader.md) und wählen Sie das aus, das Ihren Bedürfnissen am besten entspricht. # USB-Lesegeräte Verwenden Sie Stripe Terminal Android SDK 3.0.0 (oder höher), um USB-Verbindungen für den [Stripe Reader M2](https://docs.stripe.com/terminal/payments/setup-reader/stripe-m2.md) und die [BBPOS WisePad 3](https://docs.stripe.com/terminal/payments/setup-reader/bbpos-wisepad3.md)-Lesegeräte zu unterstützen. Sie müssen ein USB-Kabel verwenden, das sowohl Datenübertragung als auch Aufladen unterstützt, wie das USB 2.0-Kabel, das im Lieferumfang des Stripe Reader M2 und des BBPOS WisePad 3 enthalten ist. Wenn das mit Ihrem Terminal-Lesegerät gelieferte Kabel nur zum Aufladen geeignet ist, verwenden Sie ein USB 2.0-Kabel eines Drittanbieters, das Daten übertragen kann. So verbinden Sie Ihre App per USB-Kabel mit einem Datenterminal: 1. [Lesegeräte erkennen](https://docs.stripe.com/terminal/payments/connect-reader.md#discover-readers). 2. [Mit einem Lesegerät verbinden](https://docs.stripe.com/terminal/payments/connect-reader.md#connect-reader). ## Lesegeräte entdecken [Client-seitig] - [discoverReaders (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/discover-readers.html) - [UsbDiscoveryConfiguration (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-discovery-configuration/-usb-discovery-configuration/index.html) Stellen Sie sicher, dass das Lesegerät eingeschaltet und über ein USB 2.0-Kabel mit dem Gerät verbunden ist, auf dem Ihre App ausgeführt wird, und dass die Berechtigung zum Zugriff auf das über USB verbundene Lesegerät erteilt wurde. Wenn Sie das Lesegerät zum ersten Mal anschließen, wird eine Aufforderung des Android-Systems angezeigt, eine Verbindung zum Lesegerät herzustellen. Sie können das Kontrollkästchen „Immer geöffnet“ aktivieren, um Ihre App ohne Nachfrage zu öffnen, wenn sie mit einem Lesegerät verbunden ist. Suchen Sie dann in Ihrer App mit der Methode `discoverReaders` nach dem verbundenen Lesegerät, indem Sie `UsbDiscoveryConfiguration` verwenden. #### Kotlin ```kotlin class DiscoverReadersActivity : AppCompatActivity(), DiscoveryListener { // ... var discoverCancelable: Cancelable? = null // Action for a "Discover Readers" button fun discoverReadersAction() { val timeout = 0 val isSimulated = false val config = UsbDiscoveryConfiguration( timeout = timeout, isSimulated = isSimulated ) Terminal.getInstance().discoverReaders( config, this, object : Callback { override fun onSuccess() { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) } override fun onUpdateDiscoveredReaders(readers: List) { // In your app, display the discovered readers to the user. // Call `connectReader` after the user selects a reader to connect to. } // ... } ``` ## Mit einem Lesegerät verbinden [Client-seitig] - [connectReader (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/connect-reader.html) - [UsbConnectionConfiguration (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-connection-configuration/-usb-connection-configuration/index.html) Um eine Verbindung zu einem erkannten Lesegerät herzustellen, rufen Sie die Methode `connectReader` in Ihrer App auf. Mobile Lesegeräte müssen nicht im Voraus im Dashboard oder in der API registriert werden. Verknüpfen Sie stattdessen Ihr mobiles Lesegerät zum Verbindungszeitpunkt mit einem [Standort](https://docs.stripe.com/api/terminal/locations.md). Dazu und verwenden beim Verbindungsaufbau eine `UsbConnectionConfiguration`, wobei die `Standort-ID` auf die relevante Standort-ID festgelegt ist. #### Kotlin ```kotlin // Implement your MobileReaderListener val mobileReaderListener = yourMobileReaderListener val autoReconnectOnUnexpectedDisconnect = true val connectionConfig = UsbConnectionConfiguration( ""{{LOCATION_ID}}"", autoReconnectOnUnexpectedDisconnect, mobileReaderListener ) Terminal.getInstance().connectReader( selectedReader, connectionConfig, object : ReaderCallback { override fun onSuccess(reader: Reader) { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) ``` > #### Standby-Modus verwenden > > Programmieren Sie Ihre App nicht so, dass sie `disconnectReader` aufruft, um Strom zu sparen. Das Lesegerät verwaltet den Strom effizient über seinen Standby-Modus. ## Umgang mit Verbindungsabbrüchen von Lesegeräten - [MobileReaderListener (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-mobile-reader-listener/index.html) - [DisconnectReason (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-disconnect-reason/index.html) Zwischen Ihrer App und dem Lesegerät kann es manchmal zu Verbindungsabbrüchen kommen. Dies kann zum Beispiel passieren, wenn das USB-Kabel, das es mit Ihrem Gerät verbindet, getrennt wird. Sie können eine unerwartete Unterbrechung während des Tests simulieren, indem Sie das Lesegerät ausschalten. Der `MobileReaderListener` enthält einen `onDisconnect`-Rückruf, der Ihrer Anwendung den `DisconnectReason` mitteilt, um herauszufinden, warum das Lesegerät getrennt wurde. Gehen Sie wie folgt vor, um Verbindungsabbrüche selbst zu handhaben: 1. Setzen Sie `autoReconnectOnUnexpectedDisconnect` während der Verbindungsherstellung auf `false`. 2. Bearbeiten Sie den Rückruf bei Trennung son, dass nur eine Meldung in der App angezeigt wird. Diese weist die Nutzer/innen darauf hin, dass das Lesegerät unerwartet getrennt wurde, und mit der Erkennung und erneuten Verbindung des Lesegeräts begonnen werden kann. #### Kotlin ```kotlin class ReaderActivity : AppCompatActivity(), MobileReaderListener { // ... override fun onDisconnect(reason: DisconnectReason) { // Consider displaying a UI to notify the user and start rediscovering readers } // ... } ``` ### Verbundenes Lesegerät neu starten - [rebootReader (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/reboot-reader.html) Die Lesegeräte Stripe Reader M2 und BBPOS WisePad 3 werden automatisch neugestartet, nachdem sie 24 Stunden lang in Betrieb waren. Sie können das Lesegerät jedoch mithilfe der `rebootReader` API zum Neustart zwingen und so diesen 24-Stunden-Rhythmus zurücksetzen. Dabei trennt sich das Lesegerät vom SDK und führt einen Neustart durch. Wenn Sie die automatische Wiederverbindung verwenden, versucht das SDK anschließend, die Verbindung mit dem Lesegerät wiederherzustellen. #### Kotlin ```kotlin Terminal.getInstance().rebootReader( object : Callback { override fun onSuccess() { // Reboot succeeded and the reader will disconnect. // If your app is using automatic reconnect the reconnect will begin. } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) ``` #### Automatisch versuchen, die Verbindung wiederherzustellen Wenn die Verbindung zu einem Lesegerät getrennt wird, versuchen wir standardmäßig automatisch, die Verbindung wiederherzustellen. Wir empfehlen, während des gesamten Vorgangs Benachrichtigungen über den Status des Lesegeräts in Ihrer App anzuzeigen. Gehen Sie wie folgt vor, um bei der automatischen Wiederverbindung Benachrichtigungen in Ihrer App anzuzeigen: 1. Implementieren Sie die Rückrufe für die Wiederverbindung des Lesegeräts im `MobileReaderListener`. 2. Übergeben Sie den `MobileReaderListener` an Ihre `UsbConnectionConfiguration`. 3. Wenn das SDK [onReaderReconnectStarted](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-reconnection-listener/on-reader-reconnect-started.html) an Ihre App sendet, zeigen Sie eine Meldung an, die besagt, dass die Verbindung zum Lesegerät getrennt wurde und eine erneute Herstellung der Verbindung durchgeführt wird. - Sie können den Verbindungsversuch jederzeit mit dem `Cancelable`-Objekt stoppen. 4. Wenn sich das SDK wieder erfolgreich verbunden hat, nachdem [`onReaderReconnectSucceeded`](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-reconnection-listener/on-reader-reconnect-succeeded.html) gesendet wurde, zeigen Sie eine Meldung an, die besagt, dass die Verbindung wiederhergestellt wurde und der Betrieb normal fortgesetzt werden kann. 5. Wenn sich das SDK nicht erneut mit dem Lesegerät verbinden kann und sowohl [`onReaderReconnectFailed`](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-reconnection-listener/on-reader-reconnect-failed.html) als auch `onDisconnect` sendet, zeigen Sie eine Meldung an, die besagt, dass die Verbindung unerwartet getrennt wurde. #### Kotlin ```kotlin class CustomMobileReaderListener : MobileReaderListener { // ... override fun onReaderReconnectStarted(reader: Reader, cancelReconnect: Cancelable, reason: DisconnectReason) { // 1. Notified at the start of a reconnection attempt // Use cancelable to stop reconnection at any time } override fun onReaderReconnectSucceeded(reader: Reader) { // 2. Notified when reader reconnection succeeds // App is now connected } override fun onReaderReconnectFailed(reader: Reader) { // 3. Notified when reader reconnection fails // App is now disconnected } // ... } ``` #### Automatische Wiederverbindung beim Anwendungsstart Stripe Terminal verbindet sich nicht automatisch erneut mit einem Lesegerät, wenn Ihre Anwendung gestartet wird. Stattdessen können Sie einen Wiederverbindungsablauf erstellen, indem Sie Lesegerät-IDs speichern und versuchen, beim Start eine Verbindung zu einem bekannten Lesegerät herzustellen. 1. Wenn Sie erfolgreich eine Verbindung zu einem Lesegerät hergestellt haben, speichern Sie dessen Seriennummer an einem dauerhaften Datenspeicherort wie beispielsweise der [Shared Preferences API](https://developer.android.com/training/data-storage/shared-preferences) (Android). 1. Wenn Ihre App gestartet wird, überprüfen Sie den dauerhaften Datenspeicherort auf eine gespeicherte Seriennummer. Wenn eines gefunden wird, rufen Sie die Methode `discoverReaders` auf, damit Ihre Anwendung erneut versuchen kann, dieses Lesegerät zu finden. 2. Wenn die gespeicherte Seriennummer einem der erkannten Lesegeräte entspricht, versuchen Sie, eine Verbindung zu diesem Lesegerät herzustellen, wobei Sie das übereinstimmende reader-Objekt aus dem Aufruf von `discoverReaders` verwenden. Wenn das zuvor verbundene Lesegerät nicht gefunden wird, brechen Sie den Erkennungsvorgang ab. Zeigen Sie während des Erkennungs- und Verbindungsvorgangs eine Benutzeroberfläche an, um darauf hinzuweisen, dass eine automatische Wiederverbindung stattfindet. ## Lesegerät-Software aktualisieren [Client-seitig] - [MobileReaderListener (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-mobile-reader-listener/index.html) Ihre Anwendung muss mobile Lesegeräte aktualisieren, damit Folgendes angewendet wird: - Regionale Konfigurationen, die Sie über die Anforderungen des Kartennetzwerks und des Ausstellers auf dem Laufenden halten - Sicherheitsupdates Erforderliche Updates werden installiert, wenn eine Verbindung mit dem Lesegerät aufgebaut wurde. Sie können das Lesegerät erst verwenden, wenn die Aktualisierung abgeschlossen ist. > Um Updates installieren zu können, muss der Akkustand des Lesegeräts höher als 50 % sein. ### Erforderliche Aktualisierungen Wenn für das Lesegerät sofort erforderliche Updates verfügbar sind, erhält der `MobileReaderListener` der Integration `onStartInstallingUpdate` mit einem `ReaderSoftwareUpdate`. Das `ReaderSoftwareUpdate` enthält die notwendigen Details des Updates, einschließlich einer Schätzung der Gesamtdauer des Updates, die von `durationEstimate` angegeben wird. Während des Installationsvorgangs geht der `connectionStatus` des Terminal in `ConnectionStatus.CONNECTING` über, während das Update auf dem Lesegerät installiert wird. Ihre Anwendung muss Nutzer/innen darüber benachrichtigen, dass ein Update installiert wird, und den Fortschritt auf Ihrer Nutzeroberfläche anzeigen. Machen Sie deutlich, warum der Verbindungsaufbau länger als gewöhnlich dauern kann. Wenn der erforderliche Aktualisierungsprozess fehlschlägt, teilt Stripe den Fehler dem `MobileReaderListener` mit `onFinishInstallingUpdate` mit. Sie können sich nach einem fehlgeschlagenen erforderlichen Update nicht wieder mit dem Lesegerät verbinden, es sei denn, die folgenden Bedingungen sind erfüllt: - Das Lesegerät führt innerhalb der letzten 30 Tage die neueste Softwareversion für den Standort aus. - Die Android SDK-Version ist neuer als oder gleich `3.5.0`. Wenn die Bedingungen erfüllt sind, ist der Verbindungsvorgang trotz unvollständiger Aktualisierung erfolgreich. Stripe wiederholt die erforderliche Aktualisierung, wenn Sie das nächste Mal eine Verbindung zu diesem Lesegerät herstellen, bis es erfolgreich installiert wurde. #### Kotlin ```kotlin class ReaderActivity : AppCompatActivity(), MobileReaderListener { // ... override fun onStartInstallingUpdate(update: ReaderSoftwareUpdate, cancelable: Cancelable) { // Show UI communicating that a required update has started installing } override fun onReportReaderSoftwareUpdateProgress(progress: Float) { // Update the progress of the installation } override fun onFinishInstallingUpdate(update: ReaderSoftwareUpdate?, e: TerminalException?) { // Report success or failure of the update } // ... } ``` Sie können erforderliche Aktualisierungen mithilfe des Objekts `Cancelable` abbrechen, was ebenfalls zu einer fehlgeschlagenen Verbindung zum Lesegerät führt. Laufende inkrementelle Aktualisierungen können nicht abgebrochen werden. ### Optionale Updates Sie können optionale Aktualisierungen bis zu dem Datum verschieben, an dem sie erforderlich werden. Das SDK benachrichtigt Sie über den `MobileReaderListener` jedes Mal über optionale Aktualisierungen, wenn das Lesegerät verbunden ist, aber keine Transaktion durchführt. Wenn eine optionale Aktualisierung verfügbar ist, empfängt der `MobileReaderListener` Ihrer Anwendung den Rückruf `onReportAvailableUpdate` mit dem `ReaderSoftwareUpdate`-Objekt, das die Aktualisierungsdetails enthält, darunter: - Geschätzte Zeit für den Abschluss der Aktualisierung (`durationEstimate`) - Datum, nach dem die Aktualisierung erforderlich wird (`requiredAt`) Benachrichtigen Sie die Nutzer/innen in Ihrer Anwendung, wenn eine Aktualisierung verfügbar ist, und zeigen Sie eine Aufforderung an, optional mit der Aktualisierung fortzufahren. Um mit der zuvor mit `onReportAvailableUpdate` gemeldeten Aktualisierung fortzufahren, rufen Sie `Terminal.getInstance().installAvailableUpdate` auf. Das verfügbare Update wird auch als `reader.availableUpdate` im Reader-Objekt gespeichert. Verhindern Sie während der Aktualisierung, dass die Nutzer/innen die Seite in Ihrer App verlassen, und weisen Sie die Nutzer/innen an, die Verbindung zum Lesegerät aufrechtzuerhalten, bis die Aktualisierung abgeschlossen ist. Wir empfehlen, Ihren Nutzern/Nutzerinnen auch eine visuelle Anzeige des Aktualisierungsfortschritts zur Verfügung zu stellen. Der `MobileReaderListener` meldet den Fortschritt der Aktualisierung in der Methode `onReportReaderSoftwareUpdateProgress`. Wenn das `requiredAt`-Datum einer optionalen Aktualisierung verstrichen ist, wird die Aktualisierung erst installiert, wenn das Lesegerät verbunden wird. #### Kotlin ```kotlin class ReaderActivity : AppCompatActivity(), MobileReaderListener { // ... override fun onReportAvailableUpdate(update: ReaderSoftwareUpdate) { // An update is available for the connected reader. Show this update in your application. // Install this update using `Terminal.getInstance().installAvailableUpdate`. } // ... } ``` Unter [Aktualisierungen für Lesegeräte testen](https://docs.stripe.com/terminal/references/testing.md#simulated-reader-updates) erfahren Sie, wie Sie sicherstellen können, dass Ihre Anwendung die verschiedenen Aktualisierungstypen für ein Lesegerät verarbeiten kann. ## Nächste Schritte Sie haben Ihre Anwendung mit dem Lesegerät verbunden. Als Nächstes [ziehen Sie Ihre erste Stripe Terminal-Zahlung](https://docs.stripe.com/terminal/payments/collect-card-payment.md) ein. Der Name und das Logo von BBPOS und Chipper™ sind Marken oder eingetragene Marken von BBPOS Limited in den Vereinigten Staaten oder anderen Ländern. Der Name und das Logo von Verifone® sind entweder Marken oder eingetragene Marken von Verifone in den Vereinigten Staaten und/oder anderen Ländern. Die Verwendung der Marken stellt keine Billigung durch BBPOS oder Verifone dar.