Account Transfer API

Nutzer können mit Tap & Go Google-Konten und Daten von einem vorhandenen Android-Gerät auf ein neues Android-Gerät kopieren. Mit der Account Transfer API können Nutzer auch Anmeldedaten für benutzerdefinierte Konten kopieren, die mit AbstractAccountAuthenticator implementiert und in AccountManager eingebunden sind. Das System ruft die Account Transfer API aus dem Tap & Go-Einrichtungsassistenten auf, der auf dem neuen Gerät ausgeführt wird. Das System ruft auch die Account Transfer API auf, um Daten von einem Android-Smartphone auf ein Pixel zu übertragen.

Der „Tap and Go“-Begrüßungsbildschirm. Auf dem Bildschirm „Tap and Go“ können Sie eine Datenquelle auswählen.

Abbildung 1. Die Account Transfer API wird über den Einrichtungsassistenten für Tap & Go aufgerufen, der auf einem neuen Gerät ausgeführt wird.

Wenn Sie die Übertragung benutzerdefinierter Konten unterstützen möchten, binden Sie die Account Transfer API in Ihre App ein. Die Google Play-Dienste können dann einen bidirektionalen verschlüsselten Kanal zwischen dem vorhandenen Gerät, das auch als Quellgerät bezeichnet wird, und dem neuen Gerät, auch Zielgerät genannt, zum Übertragen von Kontodaten einrichten, wie in Abbildung 2 dargestellt. Der verschlüsselte Kanal ist für die Übertragung nicht mit Servern von Drittanbietern verbunden.

Beachten Sie die folgenden Anforderungen, wenn Sie die Account Transfer API in Ihre App einbinden:

  • Auf dem Quellgerät muss Android 4.0.1 (API-Level 14) oder höher installiert sein.
  • Auf dem Zielgerät muss Android 8.0 (API-Level 26) oder höher installiert sein.
  • Sowohl auf Quell- als auch auf Zielgeräten muss Version 11.2.0 der Google Play-Dienste oder höher installiert sein.
  • Sie müssen Ihre App mit Version 11.2.0 oder höher des Google Play Services SDK erstellen.

Abbildung der Kontoübertragung vom Quell- zum Zielgerät

Abbildung 2: Die Übertragung erfolgt über einen verschlüsselten Kanal, den die Google Play-Dienste zwischen den Quell- und Zielgeräten einrichten.

Konto Transfer API zum Projekt hinzufügen

Wenn Sie die Account Transfer API in Ihrem Projekt verwenden möchten, müssen Sie Ihr Projekt zuerst mit dem Google Play Services SDK einrichten. Eine ausführliche Anleitung zum Einrichten des Google Play Services SDK finden Sie unter Google Play-Dienste einrichten.

Wenn Sie die Google Account Transfer API selektiv in Ihrer Anwendung kompilieren möchten, fügen Sie dem Block dependencies in der Datei build.gradle in Ihrem Anwendungsmodulverzeichnis die folgende Build-Regel hinzu:

Groovig

plugins {
  id 'com.android.application'
}
...
dependencies {
    // VERSION_NUMBER must be equal to or higher than 11.2.0.
    implementation 'com.google.android.gms:play-services-auth:<VERSION_NUMBER>'
}

Kotlin

plugins {
    id("com.android.application")
}
...
dependencies {
    // VERSION_NUMBER must be equal to or higher than 11.2.0.
    implementation("com.google.android.gms:play-services-auth:<VERSION_NUMBER>")
}

Damit die Übertragung benutzerdefinierter Konten unterstützt werden kann, müssen Sie im Manifest Ihrer App den START_ACCOUNT_EXPORT-Broadcast-Empfänger für Ihren Authentifizierungsdienst deklarieren:

<receiver android:name=".MyBroadcastReceiver"  android:exported="true">
    <intent-filter>
        <action android:name="com.google.android.gms.auth.START_ACCOUNT_EXPORT"/>
        ...
    </intent-filter>
</receiver>

Wenn Ihre App nicht in einem OEM-System-Image installiert ist und Sie sie nicht in ein OEM-System-Image einbinden möchten, müssen Sie sich registrieren, um auf die ACTION_START_ACCOUNT_EXPORT-Übertragung auf dem Quellgerät zu warten, um Kontodaten wie oben beschrieben zu exportieren.

Wenn Sie Ihre App auf einem OEM-Systemimage installieren, müssen Sie sich auch für die folgenden Broadcasts registrieren:

Kontodaten übertragen

Nachdem ein Nutzer sich entschieden hat, Inhalte von seinem vorhandenen Gerät wiederherzustellen, sendet das System die ACTION_START_ACCOUNT_EXPORT-Übertragung an die Pakete, die den entsprechenden Konten auf dem Quellgerät zugeordnet sind.

Kontodaten senden

Starten Sie zum Senden von Kontodaten einen Authentifizierungsdienst auf dem Quellgerät und rufen Sie sendData() auf, nachdem der Dienst die ACTION_START_ACCOUNT_EXPORT-Übertragung empfangen hat. Sie können einen Verweis auf ein AccountTransferClient-Objekt abrufen, indem Sie entweder getAccountTransferClient(Context) oder getAccountTransferClient(Activity) aufrufen. Das folgende Code-Snippet zeigt, wie Daten vom Quellgerät gesendet werden:

Kotlin

val client: AccountTransferClient = AccountTransfer.getAccountTransferClient(this)
val exportTask: Task<Void> = client.sendData(ACCOUNT_TYPE, transferBytes)
try {
    // Wait for the task to either complete or provide the callback.
    Tasks.await(exportTask, TIMEOUT_API, TIME_UNIT)
} catch (e: Exception) {
    when(e) {
        is ExecutionException, is InterruptedException, is TimeoutException -> {
            client.notifyCompletion(ACCOUNT_TYPE,
                    AuthenticatorTransferCompletionStatus.COMPLETED_FAILURE)
            return
        }
        else -> throw e
    }
}

Java

AccountTransferClient client = AccountTransfer.getAccountTransferClient(this);
Task<Void> exportTask = client.sendData(ACCOUNT_TYPE, transferBytes);
try {
  // Wait for the task to either complete or provide the callback.
  Tasks.await(exportTask, TIMEOUT_API, TIME_UNIT);
} catch (ExecutionException | InterruptedException | TimeoutException e) {
  client.notifyCompletion(ACCOUNT_TYPE,AuthenticatorTransferCompletionStatus.COMPLETED_FAILURE);
  return;
}

Der Einrichtungsassistent auf dem Zielgerät empfängt die Kontodaten.

Kontodaten empfangen

Wenn der gleiche Authenticator-Dienst auf diesem Gerät installiert ist und durch Warten auf die ACTION_ACCOUNT_IMPORT_DATA_AVAILABLE-Übertragung sein Interesse registriert hat, sendet das Zielgerät die ACTION_ACCOUNT_IMPORT_DATA_AVAILABLE-Broadcast-Nachricht an die entsprechenden Pakete.

Starten Sie beim Empfang der ACTION_ACCOUNT_IMPORT_DATA_AVAILABLE-Übertragung einen Dienst und rufen Sie retrieveData() auf dem Zielgerät auf, um die vom Quellgerät gesendeten Daten abzurufen. Das folgende Code-Snippet zeigt, wie Daten auf dem Zielgerät abgerufen werden:

Kotlin

val client: AccountTransferClient = AccountTransfer.getAccountTransferClient(this)
val transportTask: Task<Void> = client.retrieveData(ACCOUNT_TYPE)
try {
    val transferBytes: ByteArray = Tasks.await(transferTask, TIMEOUT_API, TIME_UNIT)
    // Add the transferred account(s) to AccountManager to register with the framework.
} catch (e: Exception) {
    when(e) {
        is ExecutionException, is InterruptedException, is TimeoutException -> {
            client.notifyCompletion(ACCOUNT_TYPE,
                    AuthenticatorTransferCompletionStatus.COMPLETED_FAILURE)
            return
        }
        else -> throw e
    }
 }
client.notifyCompletion(ACCOUNT_TYPE, AuthenticatorTransferCompletionStatus.COMPLETED_SUCCESS)

Java

AccountTransferClient client = AccountTransfer.getAccountTransferClient(this);
Task<Void> transferTask = client.retrieveData(ACCOUNT_TYPE);
try {
  byte[] transferBytes = Tasks.await(transferTask, TIMEOUT_API, TIME_UNIT);
  // Add the transferred account(s) to AccountManager to register with the framework.
} catch (ExecutionException | InterruptedException | TimeoutException e) {
  client.notifyCompletion(ACCOUNT_TYPE, AuthenticatorTransferCompletionStatus.COMPLETED_FAILURE);
  return;
}
client.notifyCompletion(ACCOUNT_TYPE, AuthenticatorTransferCompletionStatus.COMPLETED_SUCCESS);

Übertragung abschließen

Bei Bedarf kann der Authentifizierungsdienst auf dem Zielgerät Daten auch durch Aufrufen von sendData() zurück zum Quellgerät übertragen.

Damit Daten auf dem Quellgerät empfangen werden können, muss Ihr Authentifizierungsdienst die ACTION_ACCOUNT_EXPORT_DATA_AVAILABLE-Übertragung überwachen. In ähnlicher Weise kann Ihr Authentifizierungsdienst auf dem Quellgerät weitere Nachrichten an das Zielgerät senden.

Wenn die Übertragung abgeschlossen ist, muss der Authentifizierungsdienst notifyCompletion() mit dem entsprechenden Abschlussstatus aufrufen.

Wenn Sie zusätzliche Sicherheitsmaßnahmen benötigen, können Sie auf dem Quell- oder Zielgerät eine nutzerseitige Identitätsbestätigung einrichten. Prüfen Sie zuerst, ob Herausforderungen angezeigt werden können. Rufen Sie dazu getDeviceMetaData() auf und prüfen Sie das Ergebnis. Wenn der Authentifizierungsdienst auf dem Zielgerät Identitätsbestätigungen unterstützt, rufen Sie showUserChallenge() auf, um die entsprechende Aufgabe anzuzeigen.

Wenn der erforderliche Authentifizierungsdienst zum Zeitpunkt der Übertragung nicht auf dem Zielgerät installiert ist, speichert das System die übertragenen Daten in einem temporären lokalen Speicher. Wenn die App zum ersten Mal installiert und geöffnet wird, kann sie retrieveData() aufrufen, um zu prüfen, ob im temporären lokalen Speicher Daten verfügbar sind. Wenn Daten verfügbar sind, gibt die Account Transfer API die Daten zurück. Andernfalls schlägt der Aufruf fehl. Wenn im temporären lokalen Speicher keine Daten vorhanden sind, schlagen alle weiteren Abrufversuche möglicherweise fehl. Rufen Sie nicht notifyCompletion() auf, da dies fehlschlagen kann.

Abbildung des Zielgeräts, das die übertragenen Daten im temporären lokalen Speicher speichert.

Abbildung 3. Wenn der erforderliche Authentifizierungsdienst nicht auf dem Zielgerät installiert ist, speichert das System die übertragenen Daten in einem temporären lokalen Speicher.

Kontoübertragung testen

Der Einrichtungsassistent wird ausgeführt, wenn Sie ein neues Gerät einrichten. Es wäre mühsam und zeitaufwendig, ein Gerät regelmäßig auf die Werkseinstellungen zurückzusetzen, um die Einrichtung und Übertragung eines Kontos zu testen. Stattdessen können Sie einen Teil des Einrichtungsassistenten ausführen, um die Übertragung des Nutzerkontos von einem Gerät auf ein anderes zu testen.

Achten Sie darauf, dass mindestens ein benutzerdefiniertes Konto auf Ihrem Quellgerät vorhanden ist, bevor Sie mit dem Test beginnen. Achten Sie außerdem darauf, dass das Zielgerät nicht in benutzerdefinierten Konten angemeldet ist. Wenn das Zielgerät beim Ausführen des Einrichtungsassistenten bereits in einem benutzerdefinierten Konto angemeldet ist, schlägt der Versuch fehl, dasselbe Konto hinzuzufügen, wenn das System die Methode AccountManager.addAccountExplicitly() aufruft.

Zu Testzwecken müssen Sie ein Gerät mit Android 8.0 (API-Level 26) oder höher als Zielgerät verwenden.

Du kannst ein Gerät mit Android 4.0.1 (API-Level 14) oder höher und der Google Play-Dienste Version 11.2.0 oder höher als Quellgerät verwenden. Um das zu testende APK zu erstellen, müssen Sie Version 11.2.0 oder höher des Google Play Services SDK verwenden.

Führen Sie den folgenden Befehl auf Ihrem Zielgerät aus, um den Ablauf des Einrichtungsassistenten zu testen:

$ adb shell am start -a android.intent.action.MAIN -n com.google.android.gms/.smartdevice.d2d.ui.TargetActivity

Der Befehl startet eine Aktivität und zeigt den Einrichtungsassistenten an. Er ist bereit, das Testgerät mit einem anderen zu koppeln. Nachdem die Geräte eine Verbindung hergestellt haben, können Sie mit der Kontoübertragung beginnen.