Account Transfer API'si

Kullanıcılar Dokun ve Aktar özelliğini kullanarak Google hesaplarını ve verilerini mevcut Android destekli bir cihazdan Android destekli yeni bir cihaza kopyalayabilir. Kullanıcıların AbstractAccountAuthenticator kullanılarak uygulanan ve AccountManager ile entegre edilen özel hesapların kimlik bilgilerini de kopyalamasına olanak tanımak için Hesap Aktarımı API'sini kullanın. Sistem, yeni cihazda çalışan Dokundur ve Devam Et kurulum sihirbazından Account Transfer API'yi çağırır. Sistem ayrıca bir kablo kullanarak Android telefondan Pixel'e veri aktarmak için Account Transfer API'yi çağırır.

"Dokun ve Aktar" karşılama ekranı. Bir veri kaynağı seçmek için Dokun ve Aktar ekranı.

Şekil 1. Account Transfer API, yeni bir cihazda çalışan Dokundur ve Devam Et kurulum sihirbazından çağrılır.

Özel hesapları aktarma desteği eklemek için Hesap Aktarımı API'sini uygulamanıza entegre edin. Google Play Hizmetleri daha sonra Şekil 2'de gösterildiği gibi hesap verilerini aktarmak için mevcut cihaz (kaynak cihaz olarak da bilinir) ile yeni cihaz (hedef cihaz olarak da bilinir) arasında çift yönlü şifrelenmiş bir kanal oluşturabilir. Şifrelenmiş kanal, aktarımı tamamlamak için üçüncü taraf sunuculara bağlı olmaya ihtiyaç duymaz.

Account Transfer API'yi uygulamanıza entegre ederken aşağıdaki gereksinimleri göz önünde bulundurun:

  • Kaynak cihazda Android 4.0.1 (API düzeyi 14) veya sonraki sürümler olmalıdır.
  • Hedef cihazda Android 8.0 (API düzeyi 26) veya sonraki bir sürüm yüklü olmalıdır.
  • Hem kaynak hem de hedef cihazlar Google Play Hizmetleri 11.2.0 veya sonraki sürümünü çalıştırmalıdır.
  • Uygulamanızı, Google Play Hizmetleri SDK'sının 11.2.0 veya sonraki bir sürümünü kullanarak derlemeniz gerekir.

Kaynaktan hedef cihaza hesap aktarımını gösteren görsel.

2. Şekil. Aktarım, Google Play Hizmetleri'nin kaynak ve hedef cihazlar arasında oluşturduğu şifrelenmiş bir kanal üzerinden gerçekleştirilir.

Account Transfer API'yi projenize ekleme

Account Transfer API'yi projenizde kullanmak için önce projenizi Google Play Hizmetleri SDK'sı ile ayarlamanız gerekir. Google Play Hizmetleri SDK'sını kurmayla ilgili ayrıntılı talimatlar için Google Play hizmetlerini kurma konusuna bakın.

Google Account Transfer API'yi uygulamanızda seçerek derlemek isterseniz uygulama modülü dizininizin içindeki build.gradle dosyasında bulunan dependencies bloğuna aşağıdaki derleme kuralını ekleyin:

Modern

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

Özel hesapların aktarılmasına yönelik destek eklemek için uygulamanızın manifest dosyasında kimlik doğrulayıcı hizmetiniz için START_ACCOUNT_EXPORT yayın alıcısını beyan etmeniz gerekir:

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

Uygulamanız bir OEM sistem görüntüsünde yüklü değilse ve uygulamanızı bir OEM sistem görüntüsüne yerleştirmeyi düşünmüyorsanız hesap verilerini yukarıda açıklanan şekilde dışa aktarmak için kaynak cihazda ACTION_START_ACCOUNT_EXPORT yayınını dinlemek üzere kaydolduğunuzdan emin olun.

Uygulamanızı bir OEM sistem görüntüsüne yüklerseniz aşağıdaki yayınlara da kaydolmanız gerekir:

Hesap verilerini aktarma

Kullanıcı, mevcut cihazındaki içeriği geri yüklemeyi seçtikten sonra, sistem ACTION_START_ACCOUNT_EXPORT yayınını kaynak cihazdaki ilgili hesaplarla ilişkili paketlere gönderir.

Hesap verilerini gönder

Hesap verilerini göndermek için kaynak cihazda bir kimlik doğrulayıcı hizmeti başlatın ve hizmet ACTION_START_ACCOUNT_EXPORT yayınını aldıktan sonra sendData() numarasını arayın. getAccountTransferClient(Context) veya getAccountTransferClient(Activity) yöntemini çağırarak bir AccountTransferClient nesnesine referans alabilirsiniz. Aşağıdaki kod snippet'i, kaynak cihazdan nasıl veri gönderileceğini göstermektedir:

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

Hesap verilerini hedef cihazdaki kurulum sihirbazı alır.

Hesap verilerini al

Bu cihazda aynı kimlik doğrulayıcı hizmeti yüklüyse ve ACTION_ACCOUNT_IMPORT_DATA_AVAILABLE yayınını dinleyerek ilgisini çekmişse hedef cihaz, ACTION_ACCOUNT_IMPORT_DATA_AVAILABLE yayınını ilgili paketlere gönderir.

ACTION_ACCOUNT_IMPORT_DATA_AVAILABLE yayınını aldıktan sonra bir hizmet başlatın ve kaynak cihazdan gönderilen verileri almak için hedef cihazda retrieveData() numaralı telefonu arayın. Aşağıdaki kod snippet'i, hedef cihazdaki verilerin nasıl alınacağını gösterir:

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

Aktarımı tamamla

Gerekirse hedef cihazdaki kimlik doğrulayıcı hizmeti de sendData() yöntemini çağırarak verileri kaynak cihaza geri aktarabilir.

Kaynak cihazda veri almak için kimlik doğrulayıcı hizmetinizin ACTION_ACCOUNT_EXPORT_DATA_AVAILABLE yayınını dinlemesi gerekir. Benzer şekilde, kaynak cihazdaki kimlik doğrulayıcı hizmetiniz hedef cihaza daha fazla mesaj gönderebilir.

Aktarım tamamlandığında, kimlik doğrulayıcı hizmetiniz notifyCompletion()'i uygun tamamlama durumuyla çağırmalıdır.

Daha fazla güvenliğe ihtiyaç duyarsanız kaynak veya hedef cihazda kullanıcılara yönelik bir sorgulama uygulayabilirsiniz. İlk olarak, getDeviceMetaData() çağrısı yapıp sonucu inceleyerek zorlukların gösterilip gösterilemeyeceğini kontrol edin. Hedef cihazdaki kimlik doğrulayıcı hizmeti, giriş sorgulamalarını destekliyorsa, sorgulamayı görüntülemek için showUserChallenge() numaralı telefonu arayın.

Aktarım sırasında gerekli kimlik doğrulayıcı hizmeti hedef cihazda yüklü değilse sistem, aktarılan verileri geçici yerel depolama alanında depolar. Uygulama ilk kez yüklenip açıldığında geçici yerel depolama alanında kullanılabilir veri olup olmadığını kontrol etmek için retrieveData() yöntemini çağırabilir. Kullanılabilir veri varsa Account Transfer API verileri döndürür. Aksi takdirde, çağrı başarısız olur. Geçici yerel depolamada hiçbir veri yoksa verileri almak için yapılacak diğer girişimler başarısız olabilir. Başarısız olabileceğinden notifyCompletion() çağrısı yapmayın.

Aktarılan verileri geçici yerel depolamada depolayan hedef cihazın görseli.

3. Şekil. Gerekli kimlik doğrulayıcı hizmeti hedef cihazda yüklü değilse sistem, aktarılan verileri geçici yerel depolama alanında depolar.

Hesap aktarımını test etme

Yeni bir cihaz kurduğunuzda kurulum sihirbazı çalışır. Bir hesabın kurulumunu ve aktarımını test etmek için cihazı düzenli olarak fabrika ayarlarına sıfırlamak yorucu ve zaman alan bir işlemdir. Bunun yerine, bir kullanıcının hesabının bir cihazdan diğerine aktarılmasını test etmek için kurulum sihirbazı akışının bir alt kümesini çalıştırabilirsiniz.

Teste başlamadan önce kaynak cihazınızda en az bir özel hesabınızın olduğundan emin olun. Ayrıca hedef cihazın herhangi bir özel hesapta oturum açmadığından emin olun. Kurulum sihirbazını çalıştırdığınızda hedef cihazda özel bir hesapta oturum açılmışsa sistem AccountManager.addAccountExplicitly() yöntemini çağırdığında aynı hesabı ekleme girişimi başarısız olur.

Test amacıyla, hedef cihaz olarak Android 8.0 (API düzeyi 26) veya sonraki sürümleri çalıştıran bir cihaz kullanmanız gerekir.

Kaynak cihaz olarak, Android 4.0.1 (API düzeyi 14) veya sonraki sürümleri çalıştıran bir cihazın yanı sıra Google Play Hizmetleri 11.2.0 veya sonraki bir sürümünü kullanabilirsiniz. Test ettiğiniz APK'yı oluşturmak için Google Play Hizmetleri SDK'sının 11.2.0 veya sonraki bir sürümünü kullanmanız gerekir.

Kurulum sihirbazı akışını test etmek için hedef cihazınızda aşağıdaki komutu çalıştırın:

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

Komut, bir etkinlik başlatır ve test cihazını başka bir cihazla eşlemeye hazır olan kurulum sihirbazını görüntüler. Cihazlar bağlantı kurduktan sonra hesap aktarım işlemine başlayabilirsiniz.