Interfejs Account Transfer API

Użytkownicy mogą kopiować konta Google i dane z dotychczasowych urządzeń z Androidem na nowe urządzenie z Androidem za pomocą funkcji Tap & Go. Interfejs Account Transfer API umożliwia użytkownikom kopiowanie danych logowania do niestandardowych kont zaimplementowanych przy użyciu AbstractAccountAuthenticator i zintegrowanych z AccountManager. System wywoła interfejs Account Transfer API z kreatora konfiguracji Tap & Go uruchomionego na nowym urządzeniu. System wywołuje też interfejs Account Transfer API, aby przenieść dane z telefonu z Androidem na Pixela za pomocą kabla.

Ekran powitalny Tap and Go. Ekran Dotknij i przenieś, aby wybrać źródło danych.

Rysunek 1. Interfejs Account Transfer API jest wywoływany z kreatora konfiguracji Tap & Go uruchomionego na nowym urządzeniu.

Aby dodać obsługę przenoszenia niestandardowych kont, zintegruj interfejs Account Transfer API w swojej aplikacji. Usługi Google Play mogą ustanowić dwukierunkowy zaszyfrowany kanał między istniejącym urządzeniem nazywanym też urządzeniem źródłowym a nowym urządzeniem (urządzeniem docelowym), aby przenieść dane konta, tak jak to pokazano na ilustracji 2. Zaszyfrowany kanał nie wymaga połączenia z serwerami innych firm do zakończenia transferu.

Podczas integrowania interfejsu Account Transfer API z aplikacją weź pod uwagę te wymagania:

  • Na urządzeniu źródłowym musi być zainstalowany Android 4.0.1 (poziom interfejsu API 14) lub nowszy.
  • Na urządzeniu docelowym musi być zainstalowany Android 8.0 (poziom interfejsu API 26) lub nowszy.
  • Zarówno na urządzeniu źródłowym, jak i docelowym muszą działać Usługi Google Play w wersji 11.2.0 lub nowszej.
  • Aplikację musisz utworzyć przy użyciu pakietu SDK Usług Google Play w wersji 11.2.0 lub nowszej.

Ilustracja przedstawiająca przenoszenie konta ze źródła na urządzenie docelowe.

Rysunek 2. Przenoszenie odbywa się przez zaszyfrowany kanał, który Usługi Google Play łączą urządzenie źródłowe i docelowe.

Dodaj do projektu interfejs Account Transfer API

Aby używać w projekcie interfejsu Account Transfer API, musisz najpierw skonfigurować projekt z użyciem pakietu SDK Usług Google Play. Szczegółowe instrukcje konfigurowania pakietu SDK Usług Google Play znajdziesz w artykule Konfigurowanie Usług Google Play.

Jeśli chcesz wybiórczo skompilować interfejs Google Account Transfer API do swojej aplikacji, dodaj tę regułę kompilacji do bloku dependencies w pliku build.gradle w katalogu modułu aplikacji:

Odlotowy

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>")
}

Aby dodać obsługę przenoszenia niestandardowych kont, musisz zadeklarować odbiornik START_ACCOUNT_EXPORT na potrzeby usługi uwierzytelniania w pliku manifestu aplikacji:

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

Jeśli aplikacja nie jest zainstalowana w obrazie systemu OEM i nie planujesz umieścić jej w obrazie systemu OEM, zarejestruj się, aby nasłuchiwać transmisji ACTION_START_ACCOUNT_EXPORT na urządzeniu źródłowym w celu wyeksportowania danych konta w opisany wyżej sposób.

Jeśli zainstalujesz aplikację na obrazie systemu OEM, musisz też zarejestrować się na te komunikaty:

Przenoszenie danych konta

Gdy użytkownik zdecyduje się przywrócić treści ze swojego urządzenia, system wysyła transmisję ACTION_START_ACCOUNT_EXPORT do pakietów powiązanych z odpowiednimi kontami na urządzeniu źródłowym.

Wyślij dane konta

Aby wysłać dane konta, uruchom usługę uwierzytelniającą na urządzeniu źródłowym i wywołaj sendData(), gdy usługa otrzyma transmisję ACTION_START_ACCOUNT_EXPORT. Odniesienie do obiektu AccountTransferClient możesz uzyskać, wywołując getAccountTransferClient(Context) lub getAccountTransferClient(Activity). Ten fragment kodu pokazuje, jak wysyłać dane z urządzenia źródłowego:

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;
}

Dane konta otrzymuje kreator konfiguracji na urządzeniu docelowym.

Odbieranie danych konta

Jeśli na tym urządzeniu jest zainstalowana ta sama usługa uwierzytelniająca i zainteresowanie nią pochodzi, nasłuchując transmisji ACTION_ACCOUNT_IMPORT_DATA_AVAILABLE, urządzenie docelowe wyśle ją do odpowiednich pakietów.ACTION_ACCOUNT_IMPORT_DATA_AVAILABLE

Po odebraniu transmisji ACTION_ACCOUNT_IMPORT_DATA_AVAILABLE uruchom usługę i wywołaj metodę retrieveData() na urządzeniu docelowym, aby pobrać dane wysłane z urządzenia źródłowego. Ten fragment kodu pokazuje, jak pobrać dane na urządzeniu docelowym:

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);

Dokończ przenoszenie

W razie potrzeby usługa uwierzytelniająca na urządzeniu docelowym może też przenieść dane z powrotem na urządzenie źródłowe, wywołując metodę sendData().

Aby można było odbierać dane na urządzeniu źródłowym, usługa uwierzytelniająca musi nasłuchiwać transmisji ACTION_ACCOUNT_EXPORT_DATA_AVAILABLE. Podobnie usługa uwierzytelniająca na urządzeniu źródłowym może wysyłać dalsze wiadomości na urządzenie docelowe.

Po zakończeniu transferu usługa uwierzytelniająca musi wywołać metodę notifyCompletion() z odpowiednim stanem ukończenia.

Jeśli wymagasz dodatkowej ochrony, możesz wprowadzić test zabezpieczający logowanie na urządzeniu źródłowym lub docelowym. Najpierw sprawdź, czy możesz wyświetlić testy, wywołując metodę getDeviceMetaData() i sprawdzając wynik. Jeśli usługa uwierzytelniająca na urządzeniu docelowym obsługuje wyzwania, wywołaj showUserChallenge(), aby wyświetlić wyzwanie.

Jeśli wymagana usługa uwierzytelniająca nie jest zainstalowana na urządzeniu docelowym w momencie przenoszenia, system przechowuje przesłane dane w tymczasowej pamięci lokalnej. Przy pierwszym zainstalowaniu i uruchomieniu aplikacja może wywołać metodę retrieveData(), by sprawdzić, czy są jakieś dane dostępne w tymczasowej pamięci lokalnej. Jeśli dostępne są jakieś dane, interfejs Account Transfer API zwraca je. W przeciwnym razie wywołanie nie powiedzie się. Jeśli dane nie są dostępne w tymczasowej pamięci lokalnej, kolejne próby ich pobrania mogą się zakończyć niepowodzeniem. Nie wywołuj notifyCompletion(), ponieważ może to spowodować błąd.

Ilustracja urządzenia docelowego, na którym przechowywane są przesłane dane w tymczasowej pamięci lokalnej.

Rysunek 3. Jeśli wymagana usługa uwierzytelniająca nie jest zainstalowana na urządzeniu docelowym, system zapisuje przesłane dane w tymczasowej pamięci lokalnej.

Testowanie przenoszenia konta

Kreator konfiguracji uruchamia się podczas konfigurowania nowego urządzenia. Regularne przywracanie ustawień fabrycznych na urządzeniu w celu przetestowania konfiguracji i przeniesienia konta może być męczące i czasochłonne. Zamiast tego możesz uruchomić podzbiór kreatora konfiguracji, aby przetestować przenoszenie konta użytkownika z jednego urządzenia na inne.

Przed rozpoczęciem testu upewnij się, że na urządzeniu źródłowym masz co najmniej jedno konto niestandardowe. Upewnij się też, że urządzenie docelowe nie jest zalogowane na żadne konta niestandardowe. Jeśli przed uruchomieniem kreatora konfiguracji urządzenie docelowe jest już zalogowane na konto niestandardowe, próba dodania tego samego konta zakończy się niepowodzeniem, gdy system wywoła metodę AccountManager.addAccountExplicitly().

Do celów testowych jako urządzeń docelowych musisz używać urządzenia z Androidem 8.0 (poziom interfejsu API 26) lub nowszym.

Jako urządzenia źródłowego może użyć urządzenia z Androidem 4.0.1 (poziom interfejsu API 14) lub nowszym oraz Usług Google Play w wersji 11.2.0 lub nowszej. Aby utworzyć testowany plik APK, musisz użyć pakietu SDK Usług Google Play w wersji 11.2.0 lub nowszej.

Aby przetestować działanie kreatora konfiguracji, uruchom to polecenie na urządzeniu docelowym:

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

Polecenie uruchamia działanie i wyświetla kreator konfiguracji gotowy do sparowania urządzenia testowego z innym urządzeniem. Po nawiązaniu połączenia możesz rozpocząć proces przenoszenia konta.