ผู้ใช้หลายคนยังคงจัดการข้อมูลเข้าสู่ระบบของตนเองเมื่อตั้งค่าอุปกรณ์ที่ใช้ Android เครื่องใหม่ กระบวนการที่ต้องลงมือทำเองนี้อาจเป็นเรื่องท้าทายและมักส่งผลให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ไม่ดี Block Store API ซึ่งเป็นไลบรารีที่ขับเคลื่อนโดยบริการ Google Play จะช่วยแก้ปัญหานี้ด้วยการให้แอปบันทึกข้อมูลเข้าสู่ระบบของผู้ใช้ได้โดยไม่ต้องมีความซับซ้อนหรือความเสี่ยงด้านความปลอดภัยที่เกี่ยวข้องกับการบันทึกรหัสผ่านของผู้ใช้
Block Store API ช่วยให้แอปจัดเก็บข้อมูลที่สามารถเรียกข้อมูลในภายหลังเพื่อตรวจสอบสิทธิ์ผู้ใช้อีกครั้งในอุปกรณ์เครื่องใหม่ได้ ซึ่งจะช่วยให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ราบรื่นยิ่งขึ้น เนื่องจากผู้ใช้ไม่จำเป็นต้องเห็นหน้าจอลงชื่อเข้าใช้เมื่อเปิดแอปเป็นครั้งแรกในอุปกรณ์ใหม่
ประโยชน์ของการใช้ Block Store มีดังนี้
- โซลูชันที่เก็บข้อมูลเข้าสู่ระบบที่เข้ารหัสสำหรับนักพัฒนาซอฟต์แวร์ ข้อมูลเข้าสู่ระบบจะได้รับการเข้ารหัสจากต้นทางถึงปลายทางเมื่อเป็นไปได้
- บันทึกโทเค็นแทนชื่อผู้ใช้และรหัสผ่าน
- ขจัดความยุ่งยากจากขั้นตอนการลงชื่อเข้าใช้
- ช่วยให้ผู้ใช้ไม่ต้องแบกรับภาระในการจัดการรหัสผ่านที่ซับซ้อน
- Google จะยืนยันตัวตนของผู้ใช้
ก่อนเริ่มต้น
หากต้องการเตรียมแอป ให้ทำตามขั้นตอนในส่วนต่อไปนี้
กำหนดค่าแอป
ในไฟล์ build.gradle ระดับโปรเจ็กต์ ให้ใส่ที่เก็บ Maven ของ Google ไว้ในทั้งส่วน buildscript และ allprojects ดังนี้
buildscript {
repositories {
google()
mavenCentral()
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
เพิ่มทรัพยากร Dependency ของบริการ Google Play สำหรับ Block Store API ลงในไฟล์บิลด์ Gradle ของโมดูล ซึ่งโดยทั่วไปคือ app/build.gradle
dependencies {
implementation 'com.google.android.gms:play-services-auth-blockstore:16.4.0'
}
วิธีการทำงาน
Block Store ช่วยให้นักพัฒนาแอปบันทึกและกู้คืนอาร์เรย์ไบต์ได้สูงสุด 16 ไบต์ ซึ่งจะช่วยให้คุณบันทึกข้อมูลสำคัญเกี่ยวกับเซสชันของผู้ใช้ปัจจุบันและมอบความยืดหยุ่นในการบันทึกข้อมูลนี้ได้ตามต้องการ ข้อมูลนี้สามารถเข้ารหัสจากต้นทางถึงปลายทางได้ และโครงสร้างพื้นฐานที่รองรับ Block Store จะสร้างขึ้นบนโครงสร้างพื้นฐานการสำรองและกู้คืนข้อมูล
คู่มือนี้จะครอบคลุม Use Case ของการบันทึกโทเค็นของผู้ใช้ลงใน Block Store ขั้นตอนต่อไปนี้จะอธิบายวิธีการทำงานของแอปที่ใช้ Block Store
- ในระหว่างขั้นตอนการตรวจสอบสิทธิ์ของแอปหรือหลังจากนั้น คุณสามารถจัดเก็บโทเค็นการตรวจสอบสิทธิ์ของผู้ใช้ไว้ใน Block Store เพื่อเรียกข้อมูลในภายหลังได้
- ระบบจะจัดเก็บโทเค็นไว้ในเครื่องและยังสำรองข้อมูลไปยังระบบคลาวด์ได้ด้วย โดยจะเข้ารหัสจากต้นทางถึงปลายทางเมื่อเป็นไปได้
- ระบบจะโอนข้อมูลเมื่อผู้ใช้เริ่มขั้นตอนการกู้คืนในอุปกรณ์เครื่องใหม่
- หากผู้ใช้กู้คืนแอปของคุณในระหว่างขั้นตอนการกู้คืน แอปจะดึงโทเค็นที่บันทึกไว้จาก Block Store ในอุปกรณ์ใหม่ได้
การบันทึกโทเค็น
เมื่อผู้ใช้ลงชื่อเข้าใช้แอป คุณสามารถบันทึกโทเค็นการตรวจสอบสิทธิ์ที่สร้างขึ้นสำหรับผู้ใช้รายนั้นลงใน Block Store ได้ คุณสามารถจัดเก็บโทเค็นนี้โดยใช้ค่าคู่คีย์ที่ไม่ซ้ำกันซึ่งมีขนาดสูงสุด 4 KB ต่อรายการ หากต้องการจัดเก็บโทเค็น ให้เรียกใช้ setBytes() และ setKey() ในอินสแตนซ์ของ StoreBytesData.Builder เพื่อจัดเก็บข้อมูลเข้าสู่ระบบของผู้ใช้ไว้ในอุปกรณ์ต้นทาง หลังจากบันทึกโทเค็นด้วย Block Store แล้ว ระบบจะเข้ารหัสโทเค็นและจัดเก็บไว้ในอุปกรณ์
ตัวอย่างต่อไปนี้แสดงวิธีบันทึกโทเค็นการตรวจสอบสิทธิ์ลงในอุปกรณ์ภายในเครื่อง
Java
BlockstoreClient client = Blockstore.getClient(this);
byte[] bytes1 = new byte[] { 1, 2, 3, 4 }; // Store one data block.
String key1 = "com.example.app.key1";
StoreBytesData storeRequest1 = StoreBytesData.Builder()
.setBytes(bytes1)
// Call this method to set the key-value pair the data should be associated with.
.setKeys(Arrays.asList(key1))
.build();
client.storeBytes(storeRequest1)
.addOnSuccessListener(result -> Log.d(TAG, "stored " + result + " bytes"))
.addOnFailureListener(e -> Log.e(TAG, "Failed to store bytes", e));
Kotlin
val client = Blockstore.getClient(this)
val bytes1 = byteArrayOf(1, 2, 3, 4) // Store one data block.
val key1 = "com.example.app.key1"
val storeRequest1 = StoreBytesData.Builder()
.setBytes(bytes1) // Call this method to set the key value with which the data should be associated with.
.setKeys(Arrays.asList(key1))
.build()
client.storeBytes(storeRequest1)
.addOnSuccessListener { result: Int ->
Log.d(TAG,
"Stored $result bytes")
}
.addOnFailureListener { e ->
Log.e(TAG, "Failed to store bytes", e)
}
ใช้โทเค็นเริ่มต้น
ข้อมูลที่บันทึกโดยใช้ StoreBytes โดยไม่มีคีย์จะใช้คีย์เริ่มต้น
BlockstoreClient.DEFAULT_BYTES_DATA_KEY
Java
BlockstoreClient client = Blockstore.getClient(this);
// The default key BlockstoreClient.DEFAULT_BYTES_DATA_KEY.
byte[] bytes = new byte[] { 9, 10 };
StoreBytesData storeRequest = StoreBytesData.Builder()
.setBytes(bytes)
.build();
client.storeBytes(storeRequest)
.addOnSuccessListener(result -> Log.d(TAG, "stored " + result + " bytes"))
.addOnFailureListener(e -> Log.e(TAG, "Failed to store bytes", e));
Kotlin
val client = Blockstore.getClient(this);
// the default key BlockstoreClient.DEFAULT_BYTES_DATA_KEY.
val bytes = byteArrayOf(1, 2, 3, 4)
val storeRequest = StoreBytesData.Builder()
.setBytes(bytes)
.build();
client.storeBytes(storeRequest)
.addOnSuccessListener { result: Int ->
Log.d(TAG,
"stored $result bytes")
}
.addOnFailureListener { e ->
Log.e(TAG, "Failed to store bytes", e)
}
กำลังดึงข้อมูลโทเค็น
หลังจากนั้น เมื่อผู้ใช้ทำตามขั้นตอนการกู้คืนในอุปกรณ์ใหม่ บริการ Google Play จะยืนยันผู้ใช้ก่อน แล้วจึงดึงข้อมูล Block Store ผู้ใช้ได้ตกลงที่จะกู้คืนข้อมูลแอปของคุณเป็นส่วนหนึ่งของขั้นตอนการกู้คืนแล้ว จึงไม่จำเป็นต้องขอความยินยอมเพิ่มเติม เมื่อผู้ใช้เปิดแอป คุณสามารถขอโทเค็นจาก Block Store ได้โดยเรียกใช้ retrieveBytes() จากนั้นระบบจะใช้โทเค็นที่ดึงมาเพื่อช่วยให้ผู้ใช้ลงชื่อเข้าใช้ในอุปกรณ์ใหม่ได้
ตัวอย่างต่อไปนี้แสดงวิธีดึงข้อมูลโทเค็นหลายรายการตามคีย์ที่เฉพาะเจาะจง
Java
BlockstoreClient client = Blockstore.getClient(this);
// Retrieve data associated with certain keys.
String key1 = "com.example.app.key1";
String key2 = "com.example.app.key2";
String key3 = BlockstoreClient.DEFAULT_BYTES_DATA_KEY; // Used to retrieve data stored without a key
List<String> requestedKeys = Arrays.asList(key1, key2, key3); // Add keys to array
RetrieveBytesRequest retrieveRequest = new RetrieveBytesRequest.Builder()
.setKeys(requestedKeys)
.build();
client.retrieveBytes(retrieveRequest)
.addOnSuccessListener(
result -> {
Map<String, BlockstoreData> blockstoreDataMap = result.getBlockstoreDataMap();
for (Map.Entry<String, BlockstoreData> entry : blockstoreDataMap.entrySet()) {
Log.d(TAG, String.format(
"Retrieved bytes %s associated with key %s.",
new String(entry.getValue().getBytes()), entry.getKey()));
}
})
.addOnFailureListener(e -> Log.e(TAG, "Failed to store bytes", e));
Kotlin
val client = Blockstore.getClient(this)
// Retrieve data associated with certain keys.
val key1 = "com.example.app.key1"
val key2 = "com.example.app.key2"
val key3 = BlockstoreClient.DEFAULT_BYTES_DATA_KEY // Used to retrieve data stored without a key
val requestedKeys = Arrays.asList(key1, key2, key3) // Add keys to array
val retrieveRequest = RetrieveBytesRequest.Builder()
.setKeys(requestedKeys)
.build()
client.retrieveBytes(retrieveRequest)
.addOnSuccessListener { result: RetrieveBytesResponse ->
val blockstoreDataMap =
result.blockstoreDataMap
for ((key, value) in blockstoreDataMap) {
Log.d(ContentValues.TAG, String.format(
"Retrieved bytes %s associated with key %s.",
String(value.bytes), key))
}
}
.addOnFailureListener { e: Exception? ->
Log.e(ContentValues.TAG,
"Failed to store bytes",
e)
}
กำลังดึงข้อมูลโทเค็นทั้งหมด
ตัวอย่างต่อไปนี้แสดงวิธีดึงข้อมูลโทเค็นทั้งหมดที่บันทึกไว้ใน BlockStore
Java
BlockstoreClient client = Blockstore.getClient(this)
// Retrieve all data.
RetrieveBytesRequest retrieveRequest = new RetrieveBytesRequest.Builder()
.setRetrieveAll(true)
.build();
client.retrieveBytes(retrieveRequest)
.addOnSuccessListener(
result -> {
Map<String, BlockstoreData> blockstoreDataMap = result.getBlockstoreDataMap();
for (Map.Entry<String, BlockstoreData> entry : blockstoreDataMap.entrySet()) {
Log.d(TAG, String.format(
"Retrieved bytes %s associated with key %s.",
new String(entry.getValue().getBytes()), entry.getKey()));
}
})
.addOnFailureListener(e -> Log.e(TAG, "Failed to store bytes", e));
Kotlin
val client = Blockstore.getClient(this)
val retrieveRequest = RetrieveBytesRequest.Builder()
.setRetrieveAll(true)
.build()
client.retrieveBytes(retrieveRequest)
.addOnSuccessListener { result: RetrieveBytesResponse ->
val blockstoreDataMap =
result.blockstoreDataMap
for ((key, value) in blockstoreDataMap) {
Log.d(ContentValues.TAG, String.format(
"Retrieved bytes %s associated with key %s.",
String(value.bytes), key))
}
}
.addOnFailureListener { e: Exception? ->
Log.e(ContentValues.TAG,
"Failed to store bytes",
e)
}
ตัวอย่างต่อไปนี้แสดงวิธีดึงข้อมูลคีย์เริ่มต้น
Java
BlockStoreClient client = Blockstore.getClient(this);
RetrieveBytesRequest retrieveRequest = new RetrieveBytesRequest.Builder()
.setKeys(Arrays.asList(BlockstoreClient.DEFAULT_BYTES_DATA_KEY))
.build();
client.retrieveBytes(retrieveRequest);
Kotlin
val client = Blockstore.getClient(this)
val retrieveRequest = RetrieveBytesRequest.Builder()
.setKeys(Arrays.asList(BlockstoreClient.DEFAULT_BYTES_DATA_KEY))
.build()
client.retrieveBytes(retrieveRequest)
กำลังลบโทเค็น
คุณอาจต้องลบโทเค็นออกจาก BlockStore ด้วยเหตุผลต่อไปนี้
- ผู้ใช้ทำตามโฟลว์ผู้ใช้ออกจากระบบ
- โทเค็นถูกเพิกถอนหรือไม่ถูกต้อง
คุณสามารถระบุโทเค็นที่ต้องการลบได้โดยตั้งค่าอาร์เรย์ของคีย์ที่ต้องลบ ซึ่งคล้ายกับการดึงข้อมูลโทเค็น
ตัวอย่างต่อไปนี้แสดงวิธีลบคีย์บางรายการ
Java
BlockstoreClient client = Blockstore.getClient(this);
// Delete data associated with certain keys.
String key1 = "com.example.app.key1";
String key2 = "com.example.app.key2";
String key3 = BlockstoreClient.DEFAULT_BYTES_DATA_KEY; // Used to delete data stored without key
List<String> requestedKeys = Arrays.asList(key1, key2, key3) // Add keys to array
DeleteBytesRequest deleteRequest = new DeleteBytesRequest.Builder()
.setKeys(requestedKeys)
.build();
client.deleteBytes(deleteRequest)
Kotlin
val client = Blockstore.getClient(this)
// Retrieve data associated with certain keys.
val key1 = "com.example.app.key1"
val key2 = "com.example.app.key2"
val key3 = BlockstoreClient.DEFAULT_BYTES_DATA_KEY // Used to retrieve data stored without a key
val requestedKeys = Arrays.asList(key1, key2, key3) // Add keys to array
val retrieveRequest = DeleteBytesRequest.Builder()
.setKeys(requestedKeys)
.build()
client.deleteBytes(retrieveRequest)
ลบโทเค็นทั้งหมด
ตัวอย่างต่อไปนี้แสดงวิธีลบโทเค็นทั้งหมดที่บันทึกไว้ใน Block Store
Java
// Delete all data.
DeleteBytesRequest deleteAllRequest = new DeleteBytesRequest.Builder()
.setDeleteAll(true)
.build();
client.deleteBytes(deleteAllRequest)
.addOnSuccessListener(result -> Log.d(TAG, "Any data found and deleted? " + result));
Kotlin
// Delete all data.
val deleteAllRequest = DeleteBytesRequest.Builder()
.setDeleteAll(true)
.build()
client.deleteBytes(deleteAllRequest)
.addOnSuccessListener { result -> Log.d(TAG, "Any data found and deleted? $result") }
การเข้ารหัสจากต้นทางถึงปลายทาง
อุปกรณ์ต้องใช้ Android 9 ขึ้นไป และผู้ใช้ต้องตั้งค่าการล็อกหน้าจอ (PIN, รูปแบบ หรือรหัสผ่าน) สำหรับอุปกรณ์เพื่อให้การเข้ารหัสจากต้นทางถึงปลายทางพร้อมใช้งาน คุณสามารถตรวจสอบได้ว่าการเข้ารหัสจะพร้อมใช้งานในอุปกรณ์หรือไม่โดยเรียกใช้ isEndToEndEncryptionAvailable()
ตัวอย่างต่อไปนี้แสดงวิธีตรวจสอบว่าการเข้ารหัสจะพร้อมใช้งานระหว่างการสำรองข้อมูลในระบบคลาวด์หรือไม่
client.isEndToEndEncryptionAvailable()
.addOnSuccessListener { result ->
Log.d(TAG, "Will Block Store cloud backup be end-to-end encrypted? $result")
}
เปิดใช้การสำรองข้อมูลในระบบคลาวด์
หากต้องการเปิดใช้การสำรองข้อมูลในระบบคลาวด์ ให้เพิ่มเมธอด setShouldBackupToCloud() ลงในออบเจ็กต์ StoreBytesData Block Store จะสำรองข้อมูลไปยังระบบคลาวด์เป็นระยะๆ โดยจะจัดเก็บไบต์เมื่อตั้งค่า setShouldBackupToCloud() เป็น "จริง"
ตัวอย่างต่อไปนี้แสดงวิธีเปิดใช้การสำรองข้อมูลในระบบคลาวด์เฉพาะเมื่อการสำรองข้อมูลในระบบคลาวด์มีการเข้ารหัสจากต้นทางถึงปลายทาง
val client = Blockstore.getClient(this)
val storeBytesDataBuilder = StoreBytesData.Builder()
.setBytes(/* BYTE_ARRAY */)
client.isEndToEndEncryptionAvailable()
.addOnSuccessListener { isE2EEAvailable ->
if (isE2EEAvailable) {
storeBytesDataBuilder.setShouldBackupToCloud(true)
Log.d(TAG, "E2EE is available, enable backing up bytes to the cloud.")
client.storeBytes(storeBytesDataBuilder.build())
.addOnSuccessListener { result ->
Log.d(TAG, "stored: ${result.getBytesStored()}")
}.addOnFailureListener { e ->
Log.e(TAG, "Failed to store bytes", e)
}
} else {
Log.d(TAG, "E2EE is not available, only store bytes for D2D restore.")
}
}
วิธีทดสอบ
ใช้วิธีการต่อไปนี้ระหว่างการพัฒนาเพื่อทดสอบขั้นตอนการกู้คืน
การถอนการติดตั้งและติดตั้งอีกครั้งในอุปกรณ์เครื่องเดิม
หากผู้ใช้เปิดใช้บริการสำรองข้อมูล (ตรวจสอบได้ที่การตั้งค่า > Google > สำรองข้อมูล) ข้อมูล Block Store จะยังคงอยู่แม้จะมีการถอนการติดตั้งและติดตั้งแอปอีกครั้ง
คุณทำตามขั้นตอนต่อไปนี้เพื่อทดสอบได้
- ผสานรวม Block Store API เข้ากับแอปทดสอบ
- ใช้แอปทดสอบเพื่อเรียกใช้ Block Store API เพื่อจัดเก็บข้อมูล
- ถอนการติดตั้งแอปทดสอบ แล้วติดตั้งแอปอีกครั้งในอุปกรณ์เครื่องเดียวกัน
- ใช้แอปทดสอบเพื่อเรียกใช้ Block Store API เพื่อดึงข้อมูลของคุณ
- ยืนยันว่าไบต์ที่ดึงมาเหมือนกับที่จัดเก็บไว้ก่อนการถอนการติดตั้ง
จากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่ง
ในกรณีส่วนใหญ่ คุณจะต้องรีเซ็ตอุปกรณ์เป้าหมายเป็นค่าเริ่มต้น จากนั้นคุณจะเข้าสู่ขั้นตอนการกู้คืนแบบไร้สายของ Android หรือการกู้คืนโดยใช้สายของ Google (สำหรับอุปกรณ์ที่รองรับ)
การกู้คืนข้อมูลในระบบคลาวด์
- ผสานรวม Block Store API กับแอปทดสอบของคุณ โดยต้องส่งแอปทดสอบไปยัง Play Store
- ในอุปกรณ์ต้นทาง ให้ใช้แอปทดสอบเพื่อเรียกใช้ Block Store API เพื่อจัดเก็บข้อมูล โดยตั้งค่า
shouldBackUpToCloudเป็นtrue - ในอุปกรณ์ที่ใช้ Android 8.0 (ระดับ API 26) ขึ้นไป คุณสามารถเรียกให้ระบบสำรองข้อมูลในระบบคลาวด์ของ Block Store ด้วยตนเองได้โดยไปที่การตั้งค่า > Google > สำรองข้อมูล แล้วคลิกปุ่ม "สำรองข้อมูลเลย"
- หากต้องการยืนยันว่าการสำรองข้อมูลในระบบคลาวด์ของ Block Store สำเร็จ ให้ทำดังนี้
- หลังจากสำรองข้อมูลเสร็จแล้ว ให้ค้นหาบรรทัดบันทึกที่มีแท็ก
[CloudSyncBackupTaskService] - คุณควรเห็นบรรทัดดังนี้
..., [CloudSyncBackupTaskService] sync result: SUCCESS,..., uploaded size: [size] bytes ...
- หลังจากสำรองข้อมูลเสร็จแล้ว ให้ค้นหาบรรทัดบันทึกที่มีแท็ก
- หลังจากสำรองข้อมูลในระบบคลาวด์ของ Block Store แล้ว จะมีระยะเวลา "พัก" 5 นาที ภายใน 5 นาทีดังกล่าว การคลิกปุ่ม "สำรองข้อมูลเลย" จะไม่ทริกเกอร์การสำรองข้อมูลในระบบคลาวด์ของ Block Store อีกครั้ง
- หากต้องการยืนยันว่าการสำรองข้อมูลในระบบคลาวด์ของ Block Store สำเร็จ ให้ทำดังนี้
- รีเซ็ตอุปกรณ์เป้าหมายเป็นค่าเริ่มต้นและทำตามขั้นตอนการกู้คืนในระบบคลาวด์ เลือกเพื่อกู้คืนแอปทดสอบในระหว่างขั้นตอนการกู้คืน ดูข้อมูลเพิ่มเติมเกี่ยวกับขั้นตอนการกู้คืนในระบบคลาวด์ได้ที่ขั้นตอนการกู้คืนในระบบคลาวด์ที่รองรับ
- ในอุปกรณ์เป้าหมาย ให้ใช้แอปทดสอบเพื่อเรียกใช้ Block Store API เพื่อดึงข้อมูลของคุณ
- ตรวจสอบว่าไบต์ที่ดึงมาเหมือนกับไบต์ที่จัดเก็บไว้ในอุปกรณ์ต้นทาง
ข้อกำหนดของอุปกรณ์
ตรวจสอบข้อกำหนดต่อไปนี้สำหรับอุปกรณ์ที่เข้าร่วมการดำเนินการของ Block Store
การเข้ารหัสจากต้นทางถึงปลายทาง
- การเข้ารหัสจากต้นทางถึงปลายทางรองรับในอุปกรณ์ที่ใช้ Android 9 (API 29) ขึ้นไป
- อุปกรณ์ต้องมีการตั้งค่าการล็อกหน้าจอด้วย PIN, รูปแบบ หรือรหัสผ่านเพื่อให้เปิดใช้การเข้ารหัสจากต้นทางถึงปลายทางและเข้ารหัสข้อมูลของผู้ใช้อย่างถูกต้อง
ขั้นตอนการกู้คืนจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่ง
การกู้คืนจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่งกำหนดให้คุณต้องมีอุปกรณ์ต้นทางและอุปกรณ์เป้าหมาย ซึ่งจะเป็นอุปกรณ์ 2 เครื่องที่กำลังโอนข้อมูล
อุปกรณ์ต้นทางต้องใช้ Android 6 (API 23) ขึ้นไปจึงจะสำรองข้อมูลได้
กำหนดเป้าหมายอุปกรณ์ที่ใช้ Android 9 (API 29) ขึ้นไปเพื่อให้สามารถกู้คืนได้
ดูข้อมูลเพิ่มเติมเกี่ยวกับขั้นตอนการกู้คืนจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่งได้ที่ขั้นตอนการกู้คืนจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่งที่รองรับ
ขั้นตอนการสำรองและกู้คืนข้อมูลในระบบคลาวด์
การสำรองและกู้คืนข้อมูลในระบบคลาวด์จะต้องใช้อุปกรณ์ต้นทางและอุปกรณ์เป้าหมาย
อุปกรณ์ต้นทางต้องใช้ Android 6 (API 23) ขึ้นไปจึงจะสำรองข้อมูลได้
ระบบรองรับอุปกรณ์เป้าหมายตามผู้ให้บริการ อุปกรณ์ Pixel สามารถใช้ฟีเจอร์นี้ได้ตั้งแต่ Android 9 (API 29) และอุปกรณ์อื่นๆ ทั้งหมดต้องใช้ Android 12 (API 31) ขึ้นไป