ব্লক স্টোর

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

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

ব্লক স্টোর ব্যবহার করার সুবিধাগুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

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

আপনি শুরু করার আগে

আপনার অ্যাপ প্রস্তুত করতে, নিম্নলিখিত বিভাগগুলিতে পদক্ষেপগুলি সম্পূর্ণ করুন৷

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

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

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

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

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

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

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

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

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

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

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

যখন একজন ব্যবহারকারী আপনার অ্যাপে সাইন ইন করেন, তখন আপনি সেই ব্যবহারকারীর জন্য তৈরি করা প্রমাণীকরণ টোকেনটিকে ব্লক স্টোরে সংরক্ষণ করতে পারেন। আপনি একটি অনন্য কী জোড়া মান ব্যবহার করে এই টোকেনটি সংরক্ষণ করতে পারেন যার সর্বোচ্চ 4kb প্রতি এন্ট্রি রয়েছে। টোকেন সংরক্ষণ করতে, ব্যবহারকারীর শংসাপত্র সোর্স ডিভাইসে সঞ্চয় করতে 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)
    }

ডিফল্ট টোকেন ব্যবহার করুন

একটি কী ছাড়া স্টোরবাইট ব্যবহার করে সংরক্ষিত ডেটা ডিফল্ট কী 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)
    }

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

পরবর্তীতে, যখন একজন ব্যবহারকারী একটি নতুন ডিভাইসে পুনরুদ্ধার প্রবাহের মধ্য দিয়ে যায়, Google Play পরিষেবাগুলি প্রথমে ব্যবহারকারীকে যাচাই করে, তারপর আপনার ব্লক স্টোর ডেটা পুনরুদ্ধার করে। ব্যবহারকারী ইতিমধ্যেই পুনরুদ্ধার প্রবাহের অংশ হিসাবে আপনার অ্যাপ ডেটা পুনরুদ্ধার করতে সম্মত হয়েছে, তাই কোনও অতিরিক্ত সম্মতির প্রয়োজন নেই। ব্যবহারকারী আপনার অ্যাপ খুললে, আপনি 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 blockstoreDataMap = result.getBlockstoreDataMap();
          for (Map.Entry 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 blockstoreDataMap = result.getBlockstoreDataMap();
          for (Map.Entry 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)

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

নীচের উদাহরণটি বর্তমানে ব্লকস্টোরে সংরক্ষিত সমস্ত টোকেন মুছে দেয়:

জাভা

// 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()
client.deleteBytes(deleteAllRequest)
  .addOnSuccessListener { result: Boolean ->
    Log.d(TAG,
          "Any data found and deleted? $result")
  }

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

এন্ড-টু-এন্ড এনক্রিপশন উপলভ্য করার জন্য, ডিভাইসটি অবশ্যই Android 9 বা উচ্চতর সংস্করণ চালাতে হবে এবং ব্যবহারকারীকে অবশ্যই তাদের ডিভাইসের জন্য একটি স্ক্রিন লক (পিন, প্যাটার্ন বা পাসওয়ার্ড) সেট করতে হবে। আপনি isEndToEndEncryptionAvailable() কল করে ডিভাইসে এনক্রিপশন উপলব্ধ হবে কিনা তা যাচাই করতে পারেন।

ক্লাউড ব্যাকআপের সময় এনক্রিপশন পাওয়া যাবে কিনা তা কীভাবে যাচাই করবেন তা নিম্নলিখিত নমুনাটি দেখায়:

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

ক্লাউড ব্যাকআপ সক্ষম করুন

ক্লাউড ব্যাকআপ সক্ষম করতে, আপনার StoreBytesData অবজেক্টে setShouldBackupToCloud() পদ্ধতি যোগ করুন। 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 > ব্যাকআপে চেক করা যেতে পারে), তাহলে অ্যাপ আনইনস্টল/পুনঃইনস্টল জুড়ে ব্লক স্টোর ডেটা বজায় থাকে।

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

  1. আপনার পরীক্ষার অ্যাপে ব্লকস্টোর এপিআই একত্রিত করুন।
  2. আপনার ডেটা সঞ্চয় করতে ব্লকস্টোর এপিআই চালু করতে পরীক্ষা অ্যাপ ব্যবহার করুন।
  3. আপনার পরীক্ষা অ্যাপ্লিকেশন আনইনস্টল করুন এবং তারপর একই ডিভাইসে আপনার অ্যাপ্লিকেশন পুনরায় ইনস্টল করুন.
  4. আপনার ডেটা পুনরুদ্ধার করতে ব্লকস্টোর এপিআই চালু করতে পরীক্ষা অ্যাপ ব্যবহার করুন।
  5. যাচাই করুন যে পুনরুদ্ধার করা বাইটগুলি আনইনস্টল করার আগে সংরক্ষিত ছিল।

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

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

মেঘ পুনরুদ্ধার

  1. আপনার পরীক্ষার অ্যাপে ব্লকস্টোর এপিআই একত্রিত করুন। পরীক্ষার অ্যাপটি প্লে স্টোরে জমা দিতে হবে।
  2. সোর্স ডিভাইসে, shouldBackUpToCloud সত্য সেট করে আপনার ডেটা সঞ্চয় করতে ব্লকস্টোর এপিআই চালু করতে টেস্ট অ্যাপ ব্যবহার করুন।
  3. O এবং উপরের ডিভাইসগুলির জন্য, আপনি ম্যানুয়ালি একটি ব্লক স্টোর ক্লাউড ব্যাকআপ ট্রিগার করতে পারেন: সেটিংস > Google > ব্যাকআপে যান, "এখনই ব্যাকআপ করুন" বোতামে ক্লিক করুন।
    1. ব্লক স্টোর ক্লাউড ব্যাকআপ সফল হয়েছে তা যাচাই করতে, আপনি করতে পারেন:
      1. ব্যাকআপ শেষ হওয়ার পরে, "CloudSyncBpTkSvc" ট্যাগ সহ লগ লাইনগুলি অনুসন্ধান করুন৷
      2. আপনার এইরকম লাইনগুলি দেখতে হবে: "......, CloudSyncBpTkSvc: সিঙ্ক ফলাফল: SUCCESS, ..., আপলোড করা আকার: XXX বাইট ..."
    2. একটি ব্লক স্টোর ক্লাউড ব্যাকআপের পরে, একটি 5-মিনিটের "কুল ডাউন" সময়কাল রয়েছে৷ সেই 5 মিনিটের মধ্যে, "এখনই ব্যাকআপ করুন" বোতামটি ক্লিক করলে অন্য ব্লক স্টোর ক্লাউড ব্যাকআপ ট্রিগার হবে না।
  4. ফ্যাক্টরি টার্গেট ডিভাইস রিসেট করুন এবং একটি ক্লাউড পুনরুদ্ধার প্রবাহের মধ্য দিয়ে যান। পুনরুদ্ধার প্রবাহ চলাকালীন আপনার পরীক্ষা অ্যাপ পুনরুদ্ধার করতে নির্বাচন করুন। ক্লাউড পুনরুদ্ধার প্রবাহ সম্পর্কে আরও তথ্যের জন্য, সমর্থিত ক্লাউড পুনরুদ্ধার প্রবাহ দেখুন।
  5. লক্ষ্য ডিভাইসে, আপনার ডেটা পুনরুদ্ধার করতে ব্লকস্টোর এপিআই চালু করতে পরীক্ষা অ্যাপ ব্যবহার করুন।
  6. যাচাই করুন যে পুনরুদ্ধার করা বাইটগুলি সোর্স ডিভাইসে সংরক্ষিত হিসাবে একই।

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

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

  • অ্যান্ড্রয়েড 9 (API 29) এবং তার উপরে চলমান ডিভাইসগুলিতে এন্ড টু এন্ড এনক্রিপশন সমর্থিত।
  • ডিভাইসটিতে অবশ্যই একটি পিন, প্যাটার্ন বা পাসওয়ার্ড সহ একটি স্ক্রিন লক সেট থাকতে হবে যাতে ব্যবহারকারীর ডেটা সঠিকভাবে এনক্রিপ্ট করার জন্য শেষ থেকে শেষ এনক্রিপশন সক্ষম করা যায়৷

ডিভাইস থেকে ডিভাইস রিস্টোর ফ্লো

ডিভাইস থেকে ডিভাইস পুনরুদ্ধারের জন্য আপনার একটি উৎস ডিভাইস এবং একটি লক্ষ্য ডিভাইস থাকা প্রয়োজন। এই দুটি ডিভাইস যা ডেটা স্থানান্তর করছে।

ব্যাকআপ নিতে সোর্স ডিভাইসগুলি অবশ্যই Android 6 (API 23) এবং তার উপরে চলমান থাকতে হবে৷

Android 9 (API 29) এবং তার উপরে চলমান ডিভাইসগুলিকে পুনরুদ্ধার করার ক্ষমতা রাখতে লক্ষ্য করুন

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

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

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

ব্যাকআপ নিতে সোর্স ডিভাইসগুলি অবশ্যই Android 6 (API 23) এবং তার উপরে চলমান থাকতে হবে৷

লক্ষ্য ডিভাইসগুলি তাদের বিক্রেতাদের উপর ভিত্তি করে সমর্থিত। পিক্সেল ডিভাইসগুলি Android 9 (API 29) থেকে এই বৈশিষ্ট্যটি ব্যবহার করতে পারে এবং অন্যান্য সমস্ত ডিভাইসে অবশ্যই Android 12 (API 31) বা তার উপরে চলমান থাকতে হবে।

,

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

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

ব্লক স্টোর ব্যবহার করার সুবিধাগুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

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

আপনি শুরু করার আগে

আপনার অ্যাপ প্রস্তুত করতে, নিম্নলিখিত বিভাগগুলিতে পদক্ষেপগুলি সম্পূর্ণ করুন৷

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

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

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

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

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

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

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

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

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

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

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

যখন একজন ব্যবহারকারী আপনার অ্যাপে সাইন ইন করেন, তখন আপনি সেই ব্যবহারকারীর জন্য তৈরি করা প্রমাণীকরণ টোকেনটিকে ব্লক স্টোরে সংরক্ষণ করতে পারেন। আপনি একটি অনন্য কী জোড়া মান ব্যবহার করে এই টোকেনটি সংরক্ষণ করতে পারেন যার সর্বোচ্চ 4kb প্রতি এন্ট্রি রয়েছে। টোকেন সংরক্ষণ করতে, ব্যবহারকারীর শংসাপত্র সোর্স ডিভাইসে সঞ্চয় করতে 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)
    }

ডিফল্ট টোকেন ব্যবহার করুন

একটি কী ছাড়া স্টোরবাইট ব্যবহার করে সংরক্ষিত ডেটা ডিফল্ট কী 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)
    }

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

পরবর্তীতে, যখন একজন ব্যবহারকারী একটি নতুন ডিভাইসে পুনরুদ্ধার প্রবাহের মধ্য দিয়ে যায়, Google Play পরিষেবাগুলি প্রথমে ব্যবহারকারীকে যাচাই করে, তারপর আপনার ব্লক স্টোর ডেটা পুনরুদ্ধার করে। ব্যবহারকারী ইতিমধ্যেই পুনরুদ্ধার প্রবাহের অংশ হিসাবে আপনার অ্যাপ ডেটা পুনরুদ্ধার করতে সম্মত হয়েছে, তাই কোনও অতিরিক্ত সম্মতির প্রয়োজন নেই। ব্যবহারকারী আপনার অ্যাপ খুললে, আপনি 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 blockstoreDataMap = result.getBlockstoreDataMap();
          for (Map.Entry 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 blockstoreDataMap = result.getBlockstoreDataMap();
          for (Map.Entry 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)

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

নীচের উদাহরণটি বর্তমানে ব্লকস্টোরে সংরক্ষিত সমস্ত টোকেন মুছে দেয়:

জাভা

// 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()
client.deleteBytes(deleteAllRequest)
  .addOnSuccessListener { result: Boolean ->
    Log.d(TAG,
          "Any data found and deleted? $result")
  }

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

এন্ড-টু-এন্ড এনক্রিপশন উপলভ্য করার জন্য, ডিভাইসটি অবশ্যই Android 9 বা উচ্চতর সংস্করণ চালাতে হবে এবং ব্যবহারকারীকে অবশ্যই তাদের ডিভাইসের জন্য একটি স্ক্রিন লক (পিন, প্যাটার্ন বা পাসওয়ার্ড) সেট করতে হবে। আপনি isEndToEndEncryptionAvailable() কল করে ডিভাইসে এনক্রিপশন উপলব্ধ হবে কিনা তা যাচাই করতে পারেন।

ক্লাউড ব্যাকআপের সময় এনক্রিপশন পাওয়া যাবে কিনা তা কীভাবে যাচাই করবেন তা নিম্নলিখিত নমুনাটি দেখায়:

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

ক্লাউড ব্যাকআপ সক্ষম করুন

ক্লাউড ব্যাকআপ সক্ষম করতে, আপনার StoreBytesData অবজেক্টে setShouldBackupToCloud() পদ্ধতি যোগ করুন। 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 > ব্যাকআপে চেক করা যেতে পারে), তাহলে অ্যাপ আনইনস্টল/পুনঃইনস্টল জুড়ে ব্লক স্টোর ডেটা বজায় থাকে।

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

  1. আপনার পরীক্ষার অ্যাপে ব্লকস্টোর এপিআই একত্রিত করুন।
  2. আপনার ডেটা সঞ্চয় করতে ব্লকস্টোর এপিআই চালু করতে পরীক্ষা অ্যাপ ব্যবহার করুন।
  3. আপনার পরীক্ষা অ্যাপ্লিকেশন আনইনস্টল করুন এবং তারপর একই ডিভাইসে আপনার অ্যাপ্লিকেশন পুনরায় ইনস্টল করুন.
  4. আপনার ডেটা পুনরুদ্ধার করতে ব্লকস্টোর এপিআই চালু করতে পরীক্ষা অ্যাপ ব্যবহার করুন।
  5. যাচাই করুন যে পুনরুদ্ধার করা বাইটগুলি আনইনস্টল করার আগে সংরক্ষিত ছিল।

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

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

মেঘ পুনরুদ্ধার

  1. আপনার পরীক্ষার অ্যাপে ব্লকস্টোর এপিআই একত্রিত করুন। পরীক্ষার অ্যাপটি প্লে স্টোরে জমা দিতে হবে।
  2. সোর্স ডিভাইসে, shouldBackUpToCloud সত্য সেট করে আপনার ডেটা সঞ্চয় করতে ব্লকস্টোর এপিআই চালু করতে টেস্ট অ্যাপ ব্যবহার করুন।
  3. O এবং উপরের ডিভাইসগুলির জন্য, আপনি ম্যানুয়ালি একটি ব্লক স্টোর ক্লাউড ব্যাকআপ ট্রিগার করতে পারেন: সেটিংস > Google > ব্যাকআপে যান, "এখনই ব্যাকআপ করুন" বোতামে ক্লিক করুন।
    1. ব্লক স্টোর ক্লাউড ব্যাকআপ সফল হয়েছে তা যাচাই করতে, আপনি করতে পারেন:
      1. ব্যাকআপ শেষ হওয়ার পরে, "CloudSyncBpTkSvc" ট্যাগ সহ লগ লাইনগুলি অনুসন্ধান করুন৷
      2. আপনার এইরকম লাইনগুলি দেখতে হবে: "......, CloudSyncBpTkSvc: সিঙ্ক ফলাফল: SUCCESS, ..., আপলোড করা আকার: XXX বাইট ..."
    2. একটি ব্লক স্টোর ক্লাউড ব্যাকআপের পরে, একটি 5-মিনিটের "কুল ডাউন" সময়কাল রয়েছে৷ সেই 5 মিনিটের মধ্যে, "এখনই ব্যাকআপ করুন" বোতামটি ক্লিক করলে অন্য ব্লক স্টোর ক্লাউড ব্যাকআপ ট্রিগার হবে না।
  4. ফ্যাক্টরি টার্গেট ডিভাইস রিসেট করুন এবং একটি ক্লাউড পুনরুদ্ধার প্রবাহের মধ্য দিয়ে যান। পুনরুদ্ধার প্রবাহ চলাকালীন আপনার পরীক্ষা অ্যাপ পুনরুদ্ধার করতে নির্বাচন করুন। ক্লাউড পুনরুদ্ধার প্রবাহ সম্পর্কে আরও তথ্যের জন্য, সমর্থিত ক্লাউড পুনরুদ্ধার প্রবাহ দেখুন।
  5. লক্ষ্য ডিভাইসে, আপনার ডেটা পুনরুদ্ধার করতে ব্লকস্টোর এপিআই চালু করতে পরীক্ষা অ্যাপ ব্যবহার করুন।
  6. যাচাই করুন যে পুনরুদ্ধার করা বাইটগুলি সোর্স ডিভাইসে সংরক্ষিত হিসাবে একই।

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

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

  • অ্যান্ড্রয়েড 9 (API 29) এবং তার উপরে চলমান ডিভাইসগুলিতে এন্ড টু এন্ড এনক্রিপশন সমর্থিত।
  • ডিভাইসটিতে অবশ্যই একটি পিন, প্যাটার্ন বা পাসওয়ার্ড সহ একটি স্ক্রিন লক সেট থাকতে হবে যাতে ব্যবহারকারীর ডেটা সঠিকভাবে এনক্রিপ্ট করার জন্য শেষ থেকে শেষ এনক্রিপশন সক্ষম করা যায়৷

ডিভাইস থেকে ডিভাইস রিস্টোর ফ্লো

ডিভাইস থেকে ডিভাইস পুনরুদ্ধারের জন্য আপনার একটি উৎস ডিভাইস এবং একটি লক্ষ্য ডিভাইস থাকা প্রয়োজন। এই দুটি ডিভাইস যা ডেটা স্থানান্তর করছে।

ব্যাকআপ নিতে সোর্স ডিভাইসগুলি অবশ্যই Android 6 (API 23) এবং তার উপরে চলমান থাকতে হবে৷

Android 9 (API 29) এবং তার উপরে চলমান ডিভাইসগুলিকে পুনরুদ্ধার করার ক্ষমতা রাখতে লক্ষ্য করুন

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

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

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

ব্যাকআপ নিতে সোর্স ডিভাইসগুলি অবশ্যই Android 6 (API 23) এবং তার উপরে চলমান থাকতে হবে৷

লক্ষ্য ডিভাইসগুলি তাদের বিক্রেতাদের উপর ভিত্তি করে সমর্থিত। পিক্সেল ডিভাইসগুলি Android 9 (API 29) থেকে এই বৈশিষ্ট্যটি ব্যবহার করতে পারে এবং অন্যান্য সমস্ত ডিভাইসে অবশ্যই Android 12 (API 31) বা তার উপরে চলমান থাকতে হবে।