অ্যান্ড্রয়েড গেমগুলিতে সাইন-ইন করুন৷

Google সাইন-ইন API বন্ধ করার পর, আমরা ২০২৬ সালে গেমস v1 SDK সরিয়ে ফেলছি। ২০২৫ সালের ফেব্রুয়ারির পর, আপনি Google Play তে গেমস v1 SDK-এর সাথে নতুনভাবে সংহত করা শিরোনাম প্রকাশ করতে পারবেন না। আমরা আপনাকে এর পরিবর্তে গেমস v2 SDK ব্যবহার করার পরামর্শ দিচ্ছি।
পূর্ববর্তী গেম v1 ইন্টিগ্রেশন সহ বিদ্যমান শিরোনামগুলি কয়েক বছর ধরে কাজ করলেও, আপনাকে জুন 2025 থেকে v2 তে স্থানান্তরিত হতে উৎসাহিত করা হচ্ছে।
এই নির্দেশিকাটি Play Games Services v1 SDK ব্যবহারের জন্য। সর্বশেষ SDK সংস্করণ সম্পর্কে তথ্যের জন্য, v2 ডকুমেন্টেশন দেখুন।

Google Play Games Services কার্যকারিতা অ্যাক্সেস করার জন্য, আপনার গেমটিকে সাইন-ইন করা খেলোয়াড়ের অ্যাকাউন্ট প্রদান করতে হবে। যদি খেলোয়াড়টি প্রমাণিত না হয়, তাহলে Google Play Games Services API-তে কল করার সময় আপনার গেমটি ত্রুটির সম্মুখীন হতে পারে। এই ডকুমেন্টেশনটি আপনার গেমে একটি নিরবচ্ছিন্ন সাইন-ইন অভিজ্ঞতা কীভাবে বাস্তবায়ন করবেন তা বর্ণনা করে।

প্লেয়ার সাইন-ইন বাস্তবায়ন করুন

GoogleSignInClient ক্লাস হল বর্তমানে সাইন-ইন করা প্লেয়ারের অ্যাকাউন্ট পুনরুদ্ধার করার জন্য এবং যদি তারা ডিভাইসে আপনার অ্যাপে আগে সাইন-ইন না করে থাকে তবে প্লেয়ারটিকে সাইন-ইন করার জন্য প্রধান এন্ট্রি পয়েন্ট।

একটি সাইন-ইন ক্লায়েন্ট তৈরি করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. নিম্নলিখিত কোড স্নিপেটে দেখানো GoogleSignInOptions অবজেক্টের মাধ্যমে একটি সাইন-ইন ক্লায়েন্ট তৈরি করুন। আপনার সাইন-ইন কনফিগার করার জন্য GoogleSignInOptions.Builder এ, আপনাকে GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN উল্লেখ করতে হবে।

    GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN;
  2. যদি আপনি একটি SnapshotsClient ব্যবহার করতে চান, তাহলে আপনার GoogleSignInOptions.Builder.requestScopes(Games.SCOPE_GAMES_SNAPSHOTS) যোগ করুন যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:

    GoogleSignInOptions  signInOptions =
        new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
            .requestScopes(Games.SCOPE_GAMES_SNAPSHOTS)
            .build();
  3. GoogleSignIn.getClient() পদ্ধতিতে কল করুন এবং পূর্ববর্তী ধাপগুলিতে কনফিগার করা বিকল্পগুলি পাস করুন। যদি কলটি সফল হয়, তাহলে Google Sign-In API GoogleSignInClient এর একটি উদাহরণ প্রদান করবে।

খেলোয়াড় ইতিমধ্যেই সাইন ইন আছে কিনা তা পরীক্ষা করুন।

আপনি GoogleSignIn.getLastSignedInAccount() ব্যবহার করে বর্তমান ডিভাইসে কোনও অ্যাকাউন্ট ইতিমধ্যেই সাইন ইন করা আছে কিনা এবং GoogleSignIn.hasPermissions() ব্যবহার করে এই অ্যাকাউন্টটিতে ইতিমধ্যেই প্রয়োজনীয় অনুমতি রয়েছে কিনা তা পরীক্ষা করতে পারেন। যদি উভয় শর্ত সত্য হয় - অর্থাৎ, getLastSignedInAccount() একটি নন-নাল মান প্রদান করে এবং hasPermissions() true প্রদান করে - আপনি ডিভাইসটি অফলাইনে থাকলেও getLastSignedInAccount() থেকে ফেরত আসা অ্যাকাউন্টটি নিরাপদে ব্যবহার করতে পারেন।

নীরবে সাইন-ইন করুন

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

silentSignIn() পদ্ধতিটি একটি Task<GoogleSignInAccount> ফেরত পাঠায়। কাজটি সম্পন্ন হলে, আপনি সাইন-ইন অ্যাকাউন্টে আগে ঘোষিত GoogleSignInAccount ক্ষেত্রটি সেট করেন যা টাস্কটি ফলাফল হিসাবে ফেরত দেয়, অথবা null , যা নির্দেশ করে যে কোনও সাইন-ইন করা ব্যবহারকারী নেই।

যদি নীরব সাইন-ইন প্রচেষ্টা ব্যর্থ হয়, তাহলে আপনি ঐচ্ছিকভাবে সাইন-ইন ব্যবহারকারী ইন্টারফেস প্রদর্শনের জন্য সাইন-ইন ইন্টেন্ট পাঠাতে পারেন, যেমনটি "একটি ইন্টারেক্টিভ সাইন-ইন সম্পাদন করুন" বিভাগে বর্ণিত হয়েছে।

যেহেতু অ্যাক্টিভিটি ফোরগ্রাউন্ডে না থাকলে সাইন-ইন করা প্লেয়ারের অবস্থা পরিবর্তিত হতে পারে, তাই আমরা অ্যাক্টিভিটির onResume() পদ্ধতি থেকে silentSignIn() কল করার পরামর্শ দিয়েছি।

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

  1. নীরব সাইন-ইন প্রবাহ শুরু করতে GoogleSignInClientsilentSignIn() পদ্ধতিতে কল করুন। নীরব সাইন-ইন সফল হলে এই কলটি একটি Task<GoogleSignInAccount> অবজেক্ট ফেরত পাঠায় যার মধ্যে একটি GoogleSignInAccount থাকে।
  2. OnCompleteListener ওভাররাইড করে প্লেয়ার সাইন-ইনের সাফল্য বা ব্যর্থতা পরিচালনা করুন।
    • যদি সাইন-ইন টাস্কটি সফল হয়, তাহলে getResult() কল করে GoogleSignInAccount অবজেক্টটি পান।
    • যদি সাইন-ইন সফল না হয়, তাহলে আপনি একটি ইন্টারেক্টিভ সাইন-ইন ফ্লো চালু করার জন্য একটি সাইন-ইন ইন্টেন্ট পাঠাতে পারেন। আপনি যে অতিরিক্ত কলব্যাক লিসেনারের ব্যবহার করতে পারেন তার তালিকার জন্য, Tasks API ডেভেলপার গাইড এবং Task API রেফারেন্স দেখুন।

নিম্নলিখিত কোড স্নিপেটটি দেখায় যে আপনার অ্যাপ কীভাবে নীরব সাইন-ইন করতে পারে:

private void signInSilently() {
  GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN;
  GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
  if (GoogleSignIn.hasPermissions(account, signInOptions.getScopeArray())) {
    // Already signed in.
    // The signed in account is stored in the 'account' variable.
    GoogleSignInAccount signedInAccount = account;
  } else {
    // Haven't been signed-in before. Try the silent sign-in first.
    GoogleSignInClient signInClient = GoogleSignIn.getClient(this, signInOptions);
    signInClient
        .silentSignIn()
        .addOnCompleteListener(
            this,
            new OnCompleteListener<GoogleSignInAccount>() {
              @Override
              public void onComplete(@NonNull Task<GoogleSignInAccount> task) {
                if (task.isSuccessful()) {
                  // The signed in account is stored in the task's result.
                  GoogleSignInAccount signedInAccount = task.getResult();
                } else {
                  // Player will need to sign-in explicitly using via UI.
                  // See [sign-in best practices](http://developers.google.com/games/services/checklist) for guidance on how and when to implement Interactive Sign-in,
                  // and [Performing Interactive Sign-in](http://developers.google.com/games/services/android/signin#performing_interactive_sign-in) for details on how to implement
                  // Interactive Sign-in.
                }
              }
            });
  }
}

@Override
protected void onResume() {
  super.onResume();
  signInSilently();
}

যদি নীরব সাইন-ইন প্রচেষ্টা ব্যর্থ হয়, তাহলে আপনি getException() কল করে বিস্তারিত স্ট্যাটাস কোড সহ ApiException পেতে পারেন। CommonStatusCodes.SIGN_IN_REQUIRED এর একটি স্ট্যাটাস কোড নির্দেশ করে যে প্লেয়ারকে সাইন-ইন করার জন্য স্পষ্ট পদক্ষেপ নিতে হবে। এই ক্ষেত্রে, আপনার অ্যাপটি পরবর্তী বিভাগে বর্ণিত একটি ইন্টারেক্টিভ সাইন-ইন প্রবাহ চালু করবে।

একটি ইন্টারেক্টিভ সাইন-ইন করুন

প্লেয়ার ইন্টারঅ্যাকশনের মাধ্যমে সাইন ইন করতে, আপনার অ্যাপটিকে সাইন-ইন ইনটেন্ট চালু করতে হবে। সফল হলে, Google সাইন-ইন API একটি ইউজার ইন্টারফেস প্রদর্শন করে যা প্লেয়ারকে সাইন ইন করার জন্য তাদের শংসাপত্র প্রবেশ করতে অনুরোধ করে। এই পদ্ধতিটি আপনার অ্যাপ ডেভেলপমেন্টকে সহজ করে তোলে, কারণ সাইন-ইন কার্যকলাপ আপনার অ্যাপের পক্ষ থেকে Google Play পরিষেবা আপডেট করার প্রয়োজন বা সম্মতি প্রম্পট দেখানোর মতো পরিস্থিতি পরিচালনা করে। ফলাফল onActivityResult কলব্যাকের মাধ্যমে ফেরত পাঠানো হয়।

ইন্টারেক্টিভভাবে সাইন-ইন করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. সাইন-ইন ইন্টেন্ট পেতে GoogleSignInClientgetSigninIntent() কল করুন, তারপর startActivity() কল করুন এবং সেই ইন্টেন্টটি পাস করুন। নিম্নলিখিত কোড স্নিপেটটি দেখায় কিভাবে আপনার অ্যাপ একটি ইন্টারেক্টিভ সাইন-ইন ফ্লো চালু করতে পারে:

    private void startSignInIntent() {
      GoogleSignInClient signInClient = GoogleSignIn.getClient(this,
          GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN);
      Intent intent = signInClient.getSignInIntent();
      startActivityForResult(intent, RC_SIGN_IN);
    }
  2. onActivityResult() কলব্যাকে, রিটার্ন করা ইন্টেন্ট থেকে ফলাফলটি পরিচালনা করুন।

    • যদি সাইন-ইন ফলাফল সফল হয়, তাহলে GoogleSignInResult থেকে GoogleSignInAccount অবজেক্টটি পান।
    • যদি সাইন-ইন ফলাফল সফল না হয়, তাহলে আপনার সাইন-ইন ত্রুটিটি মোকাবেলা করা উচিত (উদাহরণস্বরূপ, একটি সতর্কতায় একটি ত্রুটি বার্তা প্রদর্শন করে)। নিম্নলিখিত কোড স্নিপেটটি দেখায় যে আপনার অ্যাপ প্লেয়ার সাইন-ইনের ফলাফল কীভাবে পরিচালনা করতে পারে:
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
      if (requestCode == RC_SIGN_IN) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        if (result.isSuccess()) {
          // The signed in account is stored in the result.
          GoogleSignInAccount signedInAccount = result.getSignInAccount();
        } else {
          String message = result.getStatus().getStatusMessage();
          if (message == null || message.isEmpty()) {
            message = getString(R.string.signin_other_error);
          }
          new AlertDialog.Builder(this).setMessage(message)
              .setNeutralButton(android.R.string.ok, null).show();
        }
      }
    }

খেলোয়াড়ের তথ্য পুনরুদ্ধার করুন

Google Sign-In API যে GoogleSignInAccount প্রদান করে তাতে কোনও খেলোয়াড়ের তথ্য থাকে না। যদি আপনার গেমটি খেলোয়াড়ের তথ্য ব্যবহার করে, যেমন খেলোয়াড়ের প্রদর্শন নাম এবং খেলোয়াড়ের আইডি, তাহলে আপনি এই তথ্য পুনরুদ্ধার করতে এই পদক্ষেপগুলি অনুসরণ করতে পারেন।

  1. getPlayersClient() পদ্ধতিটি কল করে এবং একটি প্যারামিটার হিসাবে GoogleSignInAccount পাস করে একটি PlayersClient অবজেক্ট পান।
  2. প্লেয়ারের তথ্য ধারণকারী Player অবজেক্টটি অ্যাসিঙ্ক্রোনাসভাবে লোড করতে PlayersClient পদ্ধতি ব্যবহার করুন। উদাহরণস্বরূপ, আপনি বর্তমানে সাইন-ইন করা প্লেয়ারটি লোড করতে getCurrentPlayer() কল করতে পারেন। যদি টাস্কটি SIGN_IN_REQUIRED এর স্ট্যাটাস কোড সহ একটি ApiException ফেরত দেয়, তাহলে এটি নির্দেশ করে যে প্লেয়ারটিকে পুনরায় প্রমাণীকরণ করতে হবে। এটি করার জন্য, প্লেয়ারটিকে ইন্টারেক্টিভভাবে সাইন ইন করতে GoogleSignInClient.getSignInIntent() কল করুন।
  3. যদি টাস্কটি সফলভাবে Player অবজেক্টটি ফেরত দেয়, তাহলে আপনি নির্দিষ্ট প্লেয়ারের বিবরণ পুনরুদ্ধার করতে Player অবজেক্টের পদ্ধতিগুলি কল করতে পারেন (উদাহরণস্বরূপ, getDisplayName() অথবা getPlayerId()

একটি সাইন-ইন বোতাম দিন

আপনার গেমে একটি স্ট্যান্ডার্ড গুগল সাইন-ইন বোতাম প্রদান করতে, আপনি এই পদ্ধতিগুলির মধ্যে একটি ব্যবহার করতে পারেন:

ব্যবহারকারীরা যখন সাইন-ইন বোতামে ক্লিক করেন, তখন আপনার গেমটি "একটি ইন্টারেক্টিভ সাইন-ইন সম্পাদন করুন" বিভাগে বর্ণিত সাইন-ইন ইন্টেন্ট পাঠিয়ে সাইন-ইন প্রবাহ শুরু করবে।

এই কোড স্নিপেটটি দেখায় কিভাবে আপনি আপনার কার্যকলাপের জন্য onCreate() পদ্ধতিতে একটি সাইন-ইন বোতাম যোগ করতে পারেন।

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_sign_in);
  findViewById(R.id.sign_in_button).setOnClickListener(this);
  findViewById(R.id.sign_out_button).setOnClickListener(this);
}

নিম্নলিখিত কোড স্নিপেটটি দেখায় যে ব্যবহারকারী যখন সাইন-ইন বোতামে ক্লিক করেন তখন আপনি কীভাবে সাইন-ইন ইন্টেন্ট পাঠাতে পারেন।

@Override
public void onClick(View view) {
  if (view.getId() == R.id.sign_in_button) {
    // start the asynchronous sign in flow
    startSignInIntent();
  } else if (view.getId() == R.id.sign_out_button) {
    // sign out.
    signOut();
    // show sign-in button, hide the sign-out button
    findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE);
    findViewById(R.id.sign_out_button).setVisibility(View.GONE);
  }
}

গেমের পপ-আপগুলি প্রদর্শন করুন

আপনি GamesClient ক্লাস ব্যবহার করে আপনার গেমে পপ-আপ ভিউ প্রদর্শন করতে পারেন। উদাহরণস্বরূপ, আপনার গেমটি "ওয়েলকাম ব্যাক" বা "অ্যাচিভমেন্টস আনলকড" পপ-আপ প্রদর্শন করতে পারে। Google Play Games Services কে আপনার গেমের ভিউতে পপ-আপ চালু করার অনুমতি দিতে, setViewForPopups() পদ্ধতিটি কল করুন। আপনি setGravityForPopups() কল করে স্ক্রিনে পপ-আপটি কোথায় প্রদর্শিত হবে তা আরও কাস্টমাইজ করতে পারেন।

খেলোয়াড়কে সাইন আউট করুন

GoogleSignInClientsignOut() পদ্ধতিতে কল করার মাধ্যমে সাইন-আউট করা হয়।

private void signOut() {
  GoogleSignInClient signInClient = GoogleSignIn.getClient(this,
      GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN);
  signInClient.signOut().addOnCompleteListener(this,
      new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
          // at this point, the user is signed out.
        }
      });
}