ব্লক স্টোর

অনেক ব্যবহারকারী এখনও নতুন অ্যান্ড্রয়েড-চালিত ডিভাইস সেট আপ করার সময় তাদের নিজস্ব ক্রেডেনশিয়ালগুলি পরিচালনা করেন। এই ম্যানুয়াল প্রক্রিয়াটি বেশ কষ্টসাধ্য হয়ে উঠতে পারে এবং প্রায়শই এর ফলে ব্যবহারকারীর অভিজ্ঞতা খারাপ হয়। গুগল প্লে সার্ভিসেস দ্বারা চালিত একটি লাইব্রেরি, ব্লক স্টোর এপিআই (Block Store API), ব্যবহারকারীর পাসওয়ার্ড সংরক্ষণের সাথে জড়িত জটিলতা বা নিরাপত্তা ঝুঁকি ছাড়াই অ্যাপগুলিকে ব্যবহারকারীর ক্রেডেনশিয়াল সংরক্ষণ করার একটি উপায় প্রদান করে এই সমস্যার সমাধান করতে চায়।

ব্লক স্টোর এপিআই আপনার অ্যাপকে এমন ডেটা সংরক্ষণ করার সুযোগ দেয়, যা পরবর্তীতে নতুন ডিভাইসে ব্যবহারকারীদের পুনরায় প্রমাণীকরণের জন্য পুনরুদ্ধার করা যায়। এটি ব্যবহারকারীকে আরও নির্বিঘ্ন অভিজ্ঞতা দিতে সাহায্য করে, কারণ নতুন ডিভাইসে প্রথমবারের মতো আপনার অ্যাপ চালু করার সময় তাদের কোনো সাইন-ইন স্ক্রিন দেখতে হয় না।

ব্লক স্টোর ব্যবহারের সুবিধাগুলো নিম্নরূপ:

  • ডেভেলপারদের জন্য এনক্রিপ্টেড ক্রেডেনশিয়াল স্টোরেজ সলিউশন। সম্ভব হলে ক্রেডেনশিয়ালগুলো এন্ড-টু-এন্ড এনক্রিপ্টেড করা হয়।
  • ইউজারনেম ও পাসওয়ার্ডের পরিবর্তে টোকেন সংরক্ষণ করুন।
  • সাইন-ইন প্রক্রিয়ার প্রতিবন্ধকতা দূর করুন।
  • ব্যবহারকারীদের জটিল পাসওয়ার্ড ব্যবস্থাপনার ঝামেলা থেকে বাঁচান।
  • গুগল ব্যবহারকারীর পরিচয় যাচাই করে।

শুরু করার আগে

আপনার অ্যাপটি প্রস্তুত করতে, নিচের বিভাগগুলিতে দেওয়া ধাপগুলি সম্পূর্ণ করুন।

আপনার অ্যাপ কনফিগার করুন

আপনার প্রোজেক্ট-স্তরের build.gradle ফাইলে, buildscript এবং allprojects উভয় সেকশনেই Google-এর Maven রিপোজিটরি অন্তর্ভুক্ত করুন:

buildscript {
  repositories {
    google()
    mavenCentral()
  }
}

allprojects {
  repositories {
    google()
    mavenCentral()
  }
}

আপনার মডিউলের গ্রেডল বিল্ড ফাইলে (যা সাধারণত app/build.gradle হয়ে থাকে) ব্লক স্টোর এপিআই-এর জন্য গুগল প্লে সার্ভিসেস ডিপেন্ডেন্সি যোগ করুন:

dependencies {
  implementation 'com.google.android.gms:play-services-auth-blockstore:16.4.0'
}

এটি কীভাবে কাজ করে

ব্লক স্টোর ডেভেলপারদের ১৬ বাইট পর্যন্ত অ্যারে সংরক্ষণ এবং পুনরুদ্ধার করার সুযোগ দেয়। এর মাধ্যমে আপনি বর্তমান ব্যবহারকারী সেশন সম্পর্কিত গুরুত্বপূর্ণ তথ্য সংরক্ষণ করতে পারেন এবং নিজের পছন্দমতো উপায়ে এই তথ্য সংরক্ষণের নমনীয়তাও পান। এই ডেটা এন্ড-টু-এন্ড এনক্রিপ্টেড হতে পারে এবং ব্লক স্টোরকে সমর্থনকারী পরিকাঠামোটি ব্যাকআপ ও রিস্টোর পরিকাঠামোর উপর ভিত্তি করে নির্মিত।

এই নির্দেশিকায় ব্লক স্টোরে একজন ব্যবহারকারীর টোকেন সংরক্ষণের ব্যবহারিক প্রয়োগ আলোচনা করা হবে। ব্লক স্টোর ব্যবহারকারী একটি অ্যাপ কীভাবে কাজ করবে, তার ধাপগুলো নিচে বর্ণনা করা হলো:

  1. আপনার অ্যাপের অথেনটিকেশন ফ্লো চলাকালীন বা তার পরে যেকোনো সময়ে, আপনি ব্যবহারকারীর অথেনটিকেশন টোকেনটি পরবর্তীতে ব্যবহারের জন্য ব্লক স্টোরে সংরক্ষণ করতে পারেন।
  2. টোকেনটি স্থানীয়ভাবে সংরক্ষণ করা হবে এবং ক্লাউডেও ব্যাকআপ করা যাবে, সম্ভব হলে এন্ড-টু-এন্ড এনক্রিপ্টেড অবস্থায়।
  3. ব্যবহারকারী যখন একটি নতুন ডিভাইসে রিস্টোর প্রক্রিয়া শুরু করেন, তখন ডেটা স্থানান্তরিত হয়।
  4. যদি ব্যবহারকারী রিস্টোর প্রক্রিয়া চলাকালীন আপনার অ্যাপটি রিস্টোর করেন, তাহলে আপনার অ্যাপটি নতুন ডিভাইসের ব্লক স্টোর থেকে সংরক্ষিত টোকেনটি পুনরুদ্ধার করতে পারবে।

টোকেন সংরক্ষণ করা

যখন কোনো ব্যবহারকারী আপনার অ্যাপে সাইন ইন করেন, তখন আপনি সেই ব্যবহারকারীর জন্য তৈরি করা অথেনটিকেশন টোকেনটি ব্লক স্টোরে সংরক্ষণ করতে পারেন। আপনি এই টোকেনটি একটি অনন্য কী পেয়ার ভ্যালু ব্যবহার করে সংরক্ষণ করতে পারেন, যার প্রতিটি এন্ট্রির সর্বোচ্চ আকার ৪কেবি। টোকেনটি সংরক্ষণ করতে, ব্যবহারকারীর ক্রেডেনশিয়ালগুলো সোর্স ডিভাইসে সংরক্ষণ করার জন্য StoreBytesData.Builder এর একটি ইনস্ট্যান্সে setBytes() এবং setKey() কল করুন। ব্লক স্টোরে টোকেনটি সংরক্ষণ করার পর, টোকেনটি এনক্রিপ্ট হয়ে ডিভাইসে স্থানীয়ভাবে সংরক্ষিত হয়।

নিম্নলিখিত নমুনাটি দেখায় কিভাবে প্রমাণীকরণ টোকেনটি স্থানীয় ডিভাইসে সংরক্ষণ করতে হয়:

জাভা

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

কোটলিন

  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 ব্যবহার করে।

জাভা

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

কোটলিন

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

টোকেন পুনরুদ্ধার করা হচ্ছে

পরবর্তীতে, যখন কোনো ব্যবহারকারী একটি নতুন ডিভাইসে রিস্টোর প্রক্রিয়াটি সম্পন্ন করেন, তখন গুগল প্লে সার্ভিসেস প্রথমে ব্যবহারকারীকে যাচাই করে, তারপর আপনার ব্লক স্টোরের ডেটা সংগ্রহ করে। ব্যবহারকারী রিস্টোর প্রক্রিয়ার অংশ হিসেবেই আপনার অ্যাপের ডেটা পুনরুদ্ধার করতে ইতোমধ্যে সম্মতি দিয়েছেন, তাই অতিরিক্ত কোনো সম্মতির প্রয়োজন হয় না। ব্যবহারকারী যখন আপনার অ্যাপটি খোলেন, তখন আপনি retrieveBytes() কল করে ব্লক স্টোর থেকে আপনার টোকেনের জন্য অনুরোধ করতে পারেন। এরপর সংগৃহীত টোকেনটি নতুন ডিভাইসে ব্যবহারকারীকে সাইন-ইন করে রাখতে ব্যবহার করা যেতে পারে।

নিম্নলিখিত নমুনাটিতে দেখানো হয়েছে কীভাবে নির্দিষ্ট কী-এর উপর ভিত্তি করে একাধিক টোকেন পুনরুদ্ধার করা যায়।

জাভা

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

কোটলিন

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

সমস্ত টোকেন পুনরুদ্ধার করা হচ্ছে।

ব্লকস্টোরে সংরক্ষিত সমস্ত টোকেন কীভাবে পুনরুদ্ধার করা যায় তার একটি উদাহরণ নিচে দেওয়া হলো।

জাভা

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

কোটলিন

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

ডিফল্ট কী পুনরুদ্ধার করার একটি উদাহরণ নিচে দেওয়া হলো।

জাভা

BlockStoreClient client = Blockstore.getClient(this);
RetrieveBytesRequest retrieveRequest = new RetrieveBytesRequest.Builder()
    .setKeys(Arrays.asList(BlockstoreClient.DEFAULT_BYTES_DATA_KEY))
    .build();
client.retrieveBytes(retrieveRequest);

কোটলিন

val client = Blockstore.getClient(this)

val retrieveRequest = RetrieveBytesRequest.Builder()
  .setKeys(Arrays.asList(BlockstoreClient.DEFAULT_BYTES_DATA_KEY))
  .build()
client.retrieveBytes(retrieveRequest)

টোকেন মুছে ফেলা হচ্ছে

নিম্নলিখিত কারণগুলির জন্য ব্লকস্টোর থেকে টোকেন মুছে ফেলার প্রয়োজন হতে পারে:

  • ব্যবহারকারী সাইন আউট প্রক্রিয়াটি সম্পন্ন করেন।
  • টোকেনটি বাতিল করা হয়েছে অথবা এটি অবৈধ।

টোকেন পুনরুদ্ধার করার মতোই, যে টোকেনগুলো মুছে ফেলা প্রয়োজন সেগুলোর একটি অ্যারে সেট করার মাধ্যমে আপনি নির্দিষ্ট করে দিতে পারেন।

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে নির্দিষ্ট কীগুলি মুছে ফেলা যায়:

জাভা

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 requestedKeys = Arrays.asList(key1, key2, key3) // Add keys to array
DeleteBytesRequest deleteRequest = new DeleteBytesRequest.Builder()
      .setKeys(requestedKeys)
      .build();
client.deleteBytes(deleteRequest)

কোটলিন

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)

সমস্ত টোকেন মুছে ফেলুন

নিম্নলিখিত উদাহরণে দেখানো হয়েছে কীভাবে BlockStore-এ বর্তমানে সংরক্ষিত সমস্ত টোকেন মুছে ফেলতে হয়:

জাভা

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

কোটলিন

  val deleteAllRequest = DeleteBytesRequest.Builder()
  .setDeleteAll(true)
  .build()
retrieve bytes, the key BlockstoreClient.DEFAULT_BYTES_DATA_KEY can be used
in the RetrieveBytesRequest instance in order to get your saved data

The following example shows how to retrieve the default key.

Java

End-to-end encryption

In order for end-to-end encryption to be made available, the device must be running Android 9 or higher, and the user must have set a screen lock (PIN, pattern, or password) for their device. You can verify if encryption will be available on the device by calling isEndToEndEncryptionAvailable().

The following sample shows how to verify if encryption will be available during cloud backup:

client.isEndToEndEncryptionAvailable()
        .addOnSuccessListener { result ->
          Log.d(TAG, "Will Block Store cloud backup be end-to-end encrypted? $result")
        }

ক্লাউড ব্যাকআপ সক্রিয় করুন

ক্লাউড ব্যাকআপ চালু করতে, আপনার StoreBytesData অবজেক্টে setShouldBackupToCloud() মেথডটি যোগ করুন। যখন setShouldBackupToCloud() 'true' হিসেবে সেট করা থাকবে, তখন Block Store পর্যায়ক্রমে সংরক্ষিত বাইটগুলোর ক্লাউডে ব্যাকআপ নেবে।

নিম্নলিখিত নমুনাটি দেখায় কিভাবে শুধুমাত্র এন্ড-টু-এন্ড এনক্রিপ্টেড ক্লাউড ব্যাকআপের ক্ষেত্রে এটি সক্রিয় করতে হয়:

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

কিভাবে পরীক্ষা করতে

ডেভেলপমেন্ট চলাকালীন রিস্টোর ফ্লো পরীক্ষা করার জন্য নিম্নলিখিত পদ্ধতিগুলো ব্যবহার করুন।

একই ডিভাইসে আনইনস্টল/পুনরায় ইনস্টল করুন

যদি ব্যবহারকারী ব্যাকআপ পরিষেবা চালু করেন (এটি সেটিংস > গুগল > ব্যাকআপ- এ গিয়ে দেখা যায়), তাহলে অ্যাপটি আনইনস্টল বা পুনরায় ইনস্টল করার পরেও ব্লক স্টোরের ডেটা সংরক্ষিত থাকে।

পরীক্ষা করার জন্য আপনি এই ধাপগুলো অনুসরণ করতে পারেন:

  1. আপনার টেস্ট অ্যাপে ব্লক স্টোর এপিআই (Block Store API) সংযুক্ত করুন।
  2. আপনার ডেটা সংরক্ষণ করতে টেস্ট অ্যাপটি ব্যবহার করে ব্লক স্টোর এপিআই চালু করুন।
  3. আপনার টেস্ট অ্যাপটি আনইনস্টল করুন এবং তারপর একই ডিভাইসে অ্যাপটি পুনরায় ইনস্টল করুন।
  4. আপনার ডেটা পুনরুদ্ধার করতে টেস্ট অ্যাপটি ব্যবহার করে ব্লক স্টোর এপিআই চালু করুন।
  5. যাচাই করুন যে পুনরুদ্ধার করা বাইটগুলো আনইনস্টলেশনের আগে সংরক্ষিত বাইটের সমান কিনা।

ডিভাইস-থেকে-ডিভাইস

বেশিরভাগ ক্ষেত্রে, এর জন্য ডিভাইসটি ফ্যাক্টরি রিসেট করতে হবে। এরপর আপনি অ্যান্ড্রয়েড ওয়্যারলেস রিস্টোর প্রক্রিয়া অথবা গুগল ক্যাবল রিস্টোর (সমর্থিত ডিভাইসগুলোর জন্য) শুরু করতে পারবেন।

ক্লাউড পুনরুদ্ধার

  1. আপনার টেস্ট অ্যাপে ব্লক স্টোর এপিআই (Block Store API) যুক্ত করুন। টেস্ট অ্যাপটি প্লে স্টোরে জমা দিতে হবে।
  2. সোর্স ডিভাইসে, টেস্ট অ্যাপ ব্যবহার করে আপনার ডেটা সংরক্ষণ করতে ব্লক স্টোর এপিআই (Block Store API) কল করুন এবং shouldBackUpToCloud true সেট করুন।
  3. O এবং তার উপরের ডিভাইসগুলির জন্য, আপনি ম্যানুয়ালি একটি ব্লক স্টোর ক্লাউড ব্যাকআপ চালু করতে পারেন: সেটিংস > গুগল > ব্যাকআপ- এ যান, “ব্যাকআপ নাউ” বোতামে ক্লিক করুন।
    1. ব্লক স্টোর ক্লাউড ব্যাকআপ সফল হয়েছে কিনা তা যাচাই করতে, আপনি নিম্নলিখিত পদক্ষেপগুলো অনুসরণ করতে পারেন:
      1. ব্যাকআপ শেষ হলে, “CloudSyncBpTkSvc” ট্যাগযুক্ত লগ লাইনগুলো খুঁজুন।
      2. আপনি এইরকম লাইন দেখতে পাবেন: “......, CloudSyncBpTkSvc: sync result: SUCCESS, ..., uploaded size: XXX bytes ...”
    2. ব্লক স্টোর ক্লাউড ব্যাকআপের পরে, একটি ৫-মিনিটের “কুল ডাউন” সময় থাকে। এই ৫ মিনিটের মধ্যে, “ব্যাকআপ নাউ” বোতামে ক্লিক করলে আরেকটি ব্লক স্টোর ক্লাউড ব্যাকআপ চালু হবে না।
  4. টার্গেট ডিভাইসটি ফ্যাক্টরি রিসেট করুন এবং ক্লাউড রিস্টোর প্রক্রিয়াটি অনুসরণ করুন। রিস্টোর প্রক্রিয়া চলাকালীন আপনার টেস্ট অ্যাপটি রিস্টোর করার জন্য নির্বাচন করুন। ক্লাউড রিস্টোর ফ্লো সম্পর্কে আরও তথ্যের জন্য, ‘সমর্থিত ক্লাউড রিস্টোর ফ্লো’ দেখুন।
  5. টার্গেট ডিভাইসে, আপনার ডেটা পুনরুদ্ধার করতে টেস্ট অ্যাপটি ব্যবহার করে ব্লক স্টোর এপিআই (Block store API) কল করুন।
  6. যাচাই করুন যে পুনরুদ্ধার করা বাইটগুলো উৎস ডিভাইসে সংরক্ষিত বাইটগুলোর অনুরূপ।

ডিভাইসের প্রয়োজনীয়তা

এন্ড-টু-এন্ড এনক্রিপশন

  • অ্যান্ড্রয়েড ৯ (এপিআই ২৯) এবং এর পরবর্তী সংস্করণ চালিত ডিভাইসগুলোতে এন্ড-টু-এন্ড এনক্রিপশন সমর্থিত।
  • এন্ড-টু-এন্ড এনক্রিপশন সক্রিয় করতে এবং ব্যবহারকারীর ডেটা সঠিকভাবে এনক্রিপ্ট করার জন্য ডিভাইসটিতে অবশ্যই একটি পিন, প্যাটার্ন বা পাসওয়ার্ড সহ স্ক্রিন লক সেট করা থাকতে হবে।

ডিভাইস থেকে ডিভাইসে পুনরুদ্ধার প্রবাহ

ডিভাইস থেকে ডিভাইসে ডেটা রিস্টোর করার জন্য আপনার একটি সোর্স ডিভাইস এবং একটি টার্গেট ডিভাইস থাকা প্রয়োজন। এই দুটি ডিভাইসই হবে ডেটা ট্রান্সফারকারী ডিভাইস।

ব্যাকআপ করার জন্য সোর্স ডিভাইসগুলোতে অবশ্যই অ্যান্ড্রয়েড ৬ (এপিআই ২৩) বা তার উচ্চতর সংস্করণ চলতে হবে।

অ্যান্ড্রয়েড ৯ (এপিআই ২৯) এবং তার পরবর্তী সংস্করণে চালিত ডিভাইসগুলোতে রিস্টোর করার সুবিধা থাকবে।

ডিভাইস থেকে ডিভাইসে ডেটা পুনরুদ্ধারের প্রক্রিয়া সম্পর্কে আরও তথ্য এখানে পাওয়া যাবে।

ক্লাউড ব্যাকআপ এবং রিস্টোর ফ্লো

ক্লাউড ব্যাকআপ এবং রিস্টোরের জন্য একটি সোর্স ডিভাইস এবং একটি টার্গেট ডিভাইসের প্রয়োজন হবে।

ব্যাকআপ করার জন্য উৎস ডিভাইসগুলোতে অবশ্যই অ্যান্ড্রয়েড ৬ (এপিআই ২৩) বা তার উচ্চতর সংস্করণ চলতে হবে।

ডিভাইসগুলোর ভেন্ডরের উপর ভিত্তি করে সেগুলোর সাপোর্ট নির্ধারিত হয়। পিক্সেল ডিভাইসগুলো অ্যান্ড্রয়েড ৯ (এপিআই ২৯) থেকে এই ফিচারটি ব্যবহার করতে পারবে এবং অন্য সব ডিভাইসে অবশ্যই অ্যান্ড্রয়েড ১২ (এপিআই ৩১) বা তার উচ্চতর সংস্করণ চলতে হবে।