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

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

প্লেয়ার সাইন-ইন বাস্তবায়ন করা হচ্ছে

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

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

  1. GoogleSignInOptions অবজেক্টের মাধ্যমে একটি সাইন-ইন ক্লায়েন্ট তৈরি করুন, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে। GoogleSignInOptions.Builder এ আপনার সাইন-ইন কনফিগার করতে, আপনাকে অবশ্যই GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN নির্দিষ্ট করতে হবে৷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 সাইন-ইন 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 অবজেক্ট পান।
    • সাইন-ইন সফল না হলে, আপনি একটি ইন্টারেক্টিভ সাইন-ইন প্রবাহ চালু করতে একটি সাইন-ইন অভিপ্রায় পাঠাতে পারেন। আপনি ব্যবহার করতে পারেন এমন অতিরিক্ত কলব্যাক শ্রোতাদের একটি তালিকার জন্য, টাস্ক 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();
}

নীরব সাইন-ইন প্রচেষ্টা ব্যর্থ হলে, আপনি বিস্তারিত স্ট্যাটাস কোড সহ একটি ApiException পেতে getException() কল করতে পারেন। 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 সাইন-ইন এপিআই যে GoogleSignInAccount ফেরত দেয় তাতে কোনো প্লেয়ারের তথ্য থাকে না। যদি আপনার গেম প্লেয়ারের তথ্য ব্যবহার করে, যেমন প্লেয়ারের ডিসপ্লে নাম এবং প্লেয়ার আইডি, আপনি এই তথ্য পুনরুদ্ধার করতে এই পদক্ষেপগুলি অনুসরণ করতে পারেন৷

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

একটি সাইন-ইন বোতাম প্রদান করা হচ্ছে

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

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

এই কোড স্নিপেট দেখায় কিভাবে আপনি আপনার কার্যকলাপের জন্য 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 গেম পরিষেবাগুলিকে আপনার গেমের ভিউতে পপ-আপ চালু করার অনুমতি দিতে, 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.
        }
      });
}