GoogleApiClient এর সাথে Google API গুলি অ্যাক্সেস করা (অপ্রচলিত)

আপনি Google Play পরিষেবার লাইব্রেরিতে (যেমন Google সাইন-ইন, গেমস এবং ড্রাইভ) প্রদত্ত Google API অ্যাক্সেস করতে GoogleApiClient ("Google API ক্লায়েন্ট") অবজেক্ট ব্যবহার করতে পারেন। Google API ক্লায়েন্ট Google Play পরিষেবাগুলিতে একটি সাধারণ এন্ট্রি পয়েন্ট প্রদান করে এবং ব্যবহারকারীর ডিভাইস এবং প্রতিটি Google পরিষেবার মধ্যে নেটওয়ার্ক সংযোগ পরিচালনা করে৷

যাইহোক, নতুন GoogleApi ইন্টারফেস এবং এর প্রয়োগগুলি ব্যবহার করা সহজ এবং প্লে পরিষেবা APIগুলি অ্যাক্সেস করার পছন্দের উপায়। Google APIs অ্যাক্সেস করা দেখুন।

এই গাইডটি দেখায় যে আপনি কিভাবে করতে পারেন:

  • Google Play পরিষেবাগুলিতে স্বয়ংক্রিয়ভাবে আপনার সংযোগ পরিচালনা করুন৷
  • Google Play পরিষেবাগুলির যেকোনো একটিতে সিঙ্ক্রোনাস এবং অ্যাসিঙ্ক্রোনাস API কলগুলি সম্পাদন করুন৷
  • বিরল ক্ষেত্রে যেখানে এটি প্রয়োজনীয় সেখানে Google Play পরিষেবার সাথে আপনার সংযোগ ম্যানুয়ালি পরিচালনা করুন৷ আরও জানতে, ম্যানুয়ালি পরিচালিত সংযোগগুলি দেখুন।
চিত্র 1: Google API ক্লায়েন্ট কীভাবে Google Play Games এবং Google Drive-এর মতো উপলব্ধ Google Play পরিষেবাগুলির সাথে সংযোগ এবং কল করার জন্য একটি ইন্টারফেস প্রদান করে তা দেখানোর একটি চিত্র৷

শুরু করতে, আপনাকে প্রথমে আপনার Android SDK-এর জন্য Google Play পরিষেবা লাইব্রেরি (সংশোধন 15 বা উচ্চতর) ইনস্টল করতে হবে৷ আপনি যদি এটি ইতিমধ্যেই না করে থাকেন, তাহলে Google Play Services SDK সেট আপ করার নির্দেশাবলী অনুসরণ করুন৷

একটি স্বয়ংক্রিয়ভাবে পরিচালিত সংযোগ শুরু করুন

আপনার প্রোজেক্টটি Google Play পরিষেবা লাইব্রেরির সাথে লিঙ্ক করার পরে, আপনার কার্যকলাপের onCreate() পদ্ধতিতে GoogleApiClient.Builder API ব্যবহার করে GoogleApiClient এর একটি উদাহরণ তৈরি করুন। GoogleApiClient.Builder ক্লাস এমন পদ্ধতিগুলি প্রদান করে যা আপনাকে Google APIগুলি ব্যবহার করতে চান এবং আপনার পছন্দসই OAuth 2.0 স্কোপগুলি নির্দিষ্ট করতে দেয়৷ এখানে একটি কোড উদাহরণ রয়েছে যা একটি GoogleApiClient উদাহরণ তৈরি করে যা Google ড্রাইভ পরিষেবার সাথে সংযোগ করে:

GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
    .enableAutoManage(this /* FragmentActivity */,
                      this /* OnConnectionFailedListener */)
    .addApi(Drive.API)
    .addScope(Drive.SCOPE_FILE)
    .build();

আপনি addApi() এবং addScope() এ অতিরিক্ত কল যোগ করে একই GoogleApiClient এ একাধিক API এবং একাধিক স্কোপ যোগ করতে পারেন।

গুরুত্বপূর্ণ: আপনি যদি একটি GoogleApiClient এ অন্যান্য API-এর সাথে Wearable API যোগ করেন, তাহলে যে ডিভাইসগুলিতে Wear OS অ্যাপ ইনস্টল করা নেই সেগুলিতে আপনি ক্লায়েন্ট সংযোগের ত্রুটির সম্মুখীন হতে পারেন। সংযোগের ত্রুটিগুলি এড়াতে, addApiIfAvailable() পদ্ধতিতে কল করুন এবং Wearable API- এ পাস করুন যাতে আপনার ক্লায়েন্টকে অনুপস্থিত APIটি সুন্দরভাবে পরিচালনা করতে দেয়। আরও তথ্যের জন্য, পরিধানযোগ্য API অ্যাক্সেস করুন দেখুন।

একটি স্বয়ংক্রিয়ভাবে পরিচালিত সংযোগ শুরু করতে, অমীমাংসিত সংযোগ ত্রুটিগুলি পেতে আপনাকে OnConnectionFailedListener ইন্টারফেসের জন্য একটি বাস্তবায়ন নির্দিষ্ট করতে হবে। যখন আপনার স্বয়ং-পরিচালিত GoogleApiClient দৃষ্টান্ত Google API-এর সাথে সংযোগ করার চেষ্টা করে, তখন এটি স্বয়ংক্রিয়ভাবে UI প্রদর্শন করবে যাতে কোনো সমাধানযোগ্য সংযোগ ব্যর্থতা (উদাহরণস্বরূপ, যদি Google Play পরিষেবাগুলি আপডেট করার প্রয়োজন হয়) ঠিক করার চেষ্টা করা হয়। যদি একটি ত্রুটি ঘটে যা সমাধান করা যায় না, আপনি onConnectionFailed() এ একটি কল পাবেন।

আপনি ConnectionCallbacks ইন্টারফেসের জন্য একটি ঐচ্ছিক বাস্তবায়নও নির্দিষ্ট করতে পারেন যদি আপনার অ্যাপের জানার প্রয়োজন হয় কখন স্বয়ংক্রিয়ভাবে পরিচালিত সংযোগ প্রতিষ্ঠিত বা স্থগিত করা হয়। উদাহরণস্বরূপ, যদি আপনার অ্যাপ Google API-এ ডেটা লেখার জন্য কল করে, onConnected() পদ্ধতিতে কল করার পরেই এগুলিকে আহ্বান করা উচিত।

এখানে একটি উদাহরণ ক্রিয়াকলাপ রয়েছে যা কলব্যাক ইন্টারফেসগুলিকে প্রয়োগ করে এবং সেগুলিকে Google API ক্লায়েন্টে যুক্ত করে:

import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
import gms.drive.*;
import android.support.v4.app.FragmentActivity;

public class MyActivity extends FragmentActivity
        implements OnConnectionFailedListener {
    private GoogleApiClient mGoogleApiClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Create a GoogleApiClient instance
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this /* FragmentActivity */,
                                  this /* OnConnectionFailedListener */)
                .addApi(Drive.API)
                .addScope(Drive.SCOPE_FILE)
                .build();

        // ...
    }

    @Override
    public void onConnectionFailed(ConnectionResult result) {
        // An unresolvable error has occurred and a connection to Google APIs
        // could not be established. Display an error message, or handle
        // the failure silently

        // ...
    }
}

আপনার GoogleApiClient ইন্সট্যান্স স্বয়ংক্রিয়ভাবে সংযুক্ত হবে আপনার কার্যকলাপ কল করার পরে onStart() এবং কল করার পরে সংযোগ বিচ্ছিন্ন হয়ে যাবে onStop() । সংযোগ সম্পূর্ণ হওয়ার জন্য অপেক্ষা না করেই, GoogleApiClient তৈরি করার পরে আপনার অ্যাপটি অবিলম্বে Google API-কে পড়ার অনুরোধ করা শুরু করতে পারে।

Google পরিষেবাগুলির সাথে যোগাযোগ করুন৷

সংযোগ করার পরে, আপনার ক্লায়েন্ট পরিষেবা-নির্দিষ্ট APIগুলি ব্যবহার করে পড়তে এবং লিখতে কল করতে পারে যার জন্য আপনার অ্যাপ অনুমোদিত, API এবং স্কোপের দ্বারা নির্দিষ্ট করা হয়েছে যা আপনি আপনার GoogleApiClient উদাহরণে যোগ করেছেন৷

দ্রষ্টব্য: নির্দিষ্ট Google পরিষেবাগুলিতে কল করার আগে, আপনাকে প্রথমে Google বিকাশকারী কনসোলে আপনার অ্যাপটি নিবন্ধন করতে হতে পারে৷ নির্দেশাবলীর জন্য, আপনি যে APIটি ব্যবহার করছেন, যেমন Google ড্রাইভ বা Google সাইন-ইন এর জন্য উপযুক্ত শুরু করার নির্দেশিকা পড়ুন।

যখন আপনি GoogleApiClient ব্যবহার করে একটি পড়ার বা লেখার অনুরোধ করেন, তখন API ক্লায়েন্ট একটি PendingResult অবজেক্ট ফেরত দেয় যা অনুরোধের প্রতিনিধিত্ব করে। আপনার অ্যাপ কল করছে এমন Google পরিষেবাতে অনুরোধটি পাঠানোর আগে এটি অবিলম্বে ঘটে।

উদাহরণস্বরূপ, এখানে Google ড্রাইভ থেকে একটি ফাইল পড়ার অনুরোধ রয়েছে যা একটি PendingResult অবজেক্ট প্রদান করে:

Query query = new Query.Builder()
        .addFilter(Filters.eq(SearchableField.TITLE, filename));
PendingResult<DriveApi.MetadataBufferResult> result = Drive.DriveApi.query(mGoogleApiClient, query);

আপনার অ্যাপে একটি PendingResult অবজেক্ট থাকার পরে, আপনার অ্যাপটি অনুরোধটি একটি অ্যাসিঙ্ক্রোনাস কল বা সিঙ্ক্রোনাস কল হিসাবে পরিচালনা করা হবে কিনা তা নির্দিষ্ট করতে পারে।

পরামর্শ: Google Play পরিষেবার সাথে সংযুক্ত না থাকা অবস্থায় আপনার অ্যাপ পড়ার অনুরোধগুলি সারিবদ্ধ করতে পারে৷ উদাহরণস্বরূপ, আপনার GoogleApiClient দৃষ্টান্ত এখনও সংযুক্ত কিনা তা নির্বিশেষে আপনার অ্যাপ Google ড্রাইভ থেকে একটি ফাইল পড়ার জন্য পদ্ধতিগুলিকে কল করতে পারে৷ একটি সংযোগ প্রতিষ্ঠিত হওয়ার পরে, সারিবদ্ধ পঠিত অনুরোধগুলি কার্যকর করা হয়। আপনার Google API ক্লায়েন্ট সংযুক্ত না থাকা অবস্থায় আপনার অ্যাপটি Google Play পরিষেবাগুলিকে লেখার পদ্ধতিতে কল করলে লিখিত অনুরোধগুলি একটি ত্রুটি তৈরি করে৷

অ্যাসিঙ্ক্রোনাস কল ব্যবহার করা

অনুরোধটি অ্যাসিঙ্ক্রোনাস করতে, PendingResultsetResultCallback() কল করুন এবং ResultCallback ইন্টারফেসের একটি বাস্তবায়ন প্রদান করুন। উদাহরণস্বরূপ, এখানে অনুরোধটি অ্যাসিঙ্ক্রোনাসভাবে কার্যকর করা হয়েছে:

private void loadFile(String filename) {
    // Create a query for a specific filename in Drive.
    Query query = new Query.Builder()
            .addFilter(Filters.eq(SearchableField.TITLE, filename))
            .build();
    // Invoke the query asynchronously with a callback method
    Drive.DriveApi.query(mGoogleApiClient, query)
            .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
        @Override
        public void onResult(DriveApi.MetadataBufferResult result) {
            // Success! Handle the query result.
            // ...
        }
    });
}

যখন আপনার অ্যাপ onResult() কলব্যাকে একটি Result অবজেক্ট পায়, তখন এটি আপনার ব্যবহার করা API যেমন DriveApi.MetadataBufferResult দ্বারা নির্দিষ্ট করা উপযুক্ত সাবক্লাসের একটি উদাহরণ হিসাবে বিতরণ করা হয়।

সিঙ্ক্রোনাস কল ব্যবহার করে

আপনি যদি চান যে আপনার কোডটি একটি কঠোরভাবে সংজ্ঞায়িত ক্রমে কার্যকর করা হোক, সম্ভবত একটি কলের ফলাফল অন্যটির সাথে যুক্তি হিসাবে প্রয়োজন, তাহলে আপনি PendingResultawait() কল করে আপনার অনুরোধটিকে সিঙ্ক্রোনাস করতে পারেন। এটি থ্রেডটিকে অবরুদ্ধ করে এবং অনুরোধটি সম্পূর্ণ হলে Result বস্তুটি ফেরত দেয়। আপনি যে APIটি ব্যবহার করছেন, উদাহরণস্বরূপ DriveApi.MetadataBufferResult দ্বারা নির্দিষ্ট করা উপযুক্ত সাবক্লাসের একটি উদাহরণ হিসাবে এই বস্তুটি বিতরণ করা হয়েছে।

যেহেতু কলিং await() ফলাফল না আসা পর্যন্ত থ্রেডটিকে অবরুদ্ধ করে, আপনার অ্যাপ কখনই UI থ্রেডে Google API-এর কাছে সিঙ্ক্রোনাস অনুরোধ করবে না। আপনার অ্যাপ একটি AsyncTask অবজেক্ট ব্যবহার করে একটি নতুন থ্রেড তৈরি করতে পারে এবং সিঙ্ক্রোনাস অনুরোধ করতে সেই থ্রেডটি ব্যবহার করতে পারে।

নিম্নোক্ত উদাহরণটি দেখায় কিভাবে একটি সিঙ্ক্রোনাস কল হিসাবে Google ড্রাইভে একটি ফাইল অনুরোধ করতে হয়:

private void loadFile(String filename) {
    new GetFileTask().execute(filename);
}

private class GetFileTask extends AsyncTask<String, Void, Void> {
    protected void doInBackground(String filename) {
        Query query = new Query.Builder()
                .addFilter(Filters.eq(SearchableField.TITLE, filename))
                .build();
        // Invoke the query synchronously
        DriveApi.MetadataBufferResult result =
                Drive.DriveApi.query(mGoogleApiClient, query).await();

        // Continue doing other stuff synchronously
        // ...
    }
}

পরিধানযোগ্য API অ্যাক্সেস করুন

পরিধানযোগ্য API হ্যান্ডহেল্ড এবং পরিধানযোগ্য ডিভাইসে চালিত অ্যাপগুলির জন্য একটি যোগাযোগ চ্যানেল সরবরাহ করে। API-এ ডেটা অবজেক্টের একটি সেট রয়েছে যা সিস্টেম পাঠাতে এবং সিঙ্ক্রোনাইজ করতে পারে এবং শ্রোতারা যেগুলি ডেটা স্তর ব্যবহার করে আপনার অ্যাপগুলিকে গুরুত্বপূর্ণ ইভেন্টগুলিকে অবহিত করে৷ পরিধানযোগ্য এপিআই Android 4.3 (API লেভেল 18) বা উচ্চতর চলমান ডিভাইসগুলিতে উপলভ্য হয় যখন একটি পরিধানযোগ্য ডিভাইস সংযুক্ত থাকে এবং ডিভাইসে Wear OS সহচর অ্যাপ ইনস্টল করা থাকে।

পরিধানযোগ্য API স্ট্যান্ড-একা ব্যবহার করে

যদি আপনার অ্যাপ পরিধানযোগ্য API ব্যবহার করে কিন্তু অন্য Google API ব্যবহার করে না, তাহলে আপনি addApi() পদ্ধতিতে কল করে এই API যোগ করতে পারেন। নিম্নলিখিত উদাহরণটি দেখায় কিভাবে আপনার GoogleApiClient উদাহরণে পরিধানযোগ্য API যোগ করতে হয়:

GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
    .enableAutoManage(this /* FragmentActivity */,
                      this /* OnConnectionFailedListener */)
    .addApi(Wearable.API)
    .build();

পরিধানযোগ্য API উপলব্ধ না থাকা পরিস্থিতিতে, পরিধানযোগ্য API অন্তর্ভুক্ত সংযোগের অনুরোধগুলি API_UNAVAILABLE ত্রুটি কোডের সাথে ব্যর্থ হয়।

নিম্নলিখিত উদাহরণ দেখায় কিভাবে পরিধানযোগ্য API উপলব্ধ কিনা তা নির্ধারণ করতে হয়:

// Connection failed listener method for a client that only
// requests access to the Wearable API
@Override
public void onConnectionFailed(ConnectionResult result) {
    if (result.getErrorCode() == ConnectionResult.API_UNAVAILABLE) {
        // The Wearable API is unavailable
    }
    // ...
}

অন্যান্য Google API-এর সাথে পরিধানযোগ্য API ব্যবহার করা

যদি আপনার অ্যাপ অন্যান্য Google API-এর পাশাপাশি পরিধানযোগ্য API ব্যবহার করে, addApiIfAvailable() পদ্ধতিতে কল করুন এবং এটি উপলব্ধ কিনা তা পরীক্ষা করতে পরিধানযোগ্য API- এ পাস করুন। আপনি এই চেকটি ব্যবহার করতে পারেন যাতে এপিআই অনুপলব্ধ হয় এমন কেসগুলিকে সুন্দরভাবে পরিচালনা করতে আপনার অ্যাপকে সাহায্য করতে পারেন৷

নিম্নলিখিত উদাহরণ দেখায় কিভাবে ড্রাইভ API সহ পরিধানযোগ্য API অ্যাক্সেস করতে হয়:

// Create a GoogleApiClient instance
mGoogleApiClient = new GoogleApiClient.Builder(this)
        .enableAutoManage(this /* FragmentActivity */,
                          this /* OnConnectionFailedListener */)
        .addApi(Drive.API)
        .addApiIfAvailable(Wearable.API)
        .addScope(Drive.SCOPE_FILE)
        .build();

উপরের উদাহরণে, GoogleApiClient অনুপলব্ধ হলে পরিধানযোগ্য API-এর সাথে সংযোগ না করে Google ড্রাইভের সাথে সফলভাবে সংযোগ করতে পারে৷ আপনি আপনার GoogleApiClient উদাহরণ সংযোগ করার পরে, API কল করার আগে পরিধানযোগ্য API উপলব্ধ রয়েছে তা নিশ্চিত করুন:

boolean wearAvailable = mGoogleApiClient.hasConnectedApi(Wearable.API);

API সংযোগ ব্যর্থতা উপেক্ষা করা

যদি আপনি addApi() কল করেন এবং GoogleApiClient সেই API-তে সফলভাবে সংযোগ করতে অক্ষম হয়, তাহলে সেই ক্লায়েন্টের জন্য সম্পূর্ণ সংযোগ অপারেশন ব্যর্থ হয় এবং onConnectionFailed() কলব্যাকটি ট্রিগার করে।

আপনি addApiIfAvailable() ব্যবহার করে উপেক্ষা করার জন্য একটি API সংযোগ ব্যর্থতা নিবন্ধন করতে পারেন। যদি addApiIfAvailable() এর সাথে যোগ করা একটি API একটি অ-পুনরুদ্ধারযোগ্য ত্রুটির (যেমন পরিধানের জন্য API_UNAVAILABLE ) কারণে সংযোগ করতে ব্যর্থ হয়, তাহলে সেই APIটি আপনার GoogleApiClient থেকে বাদ দেওয়া হবে এবং ক্লায়েন্ট অন্য APIগুলির সাথে সংযোগ করতে এগিয়ে যাবে৷ যাইহোক, যদি কোনো API সংযোগ একটি পুনরুদ্ধারযোগ্য ত্রুটির সাথে ব্যর্থ হয় (যেমন একটি OAuth সম্মতি রেজোলিউশন উদ্দেশ্য), ক্লায়েন্ট সংযোগ অপারেশন ব্যর্থ হয়। একটি স্বয়ংক্রিয়ভাবে পরিচালিত সংযোগ ব্যবহার করার সময় GoogleApiClient সম্ভব হলে এই ধরনের ত্রুটিগুলি সমাধান করার চেষ্টা করবে৷ একটি ম্যানুয়ালি পরিচালিত সংযোগ ব্যবহার করার সময় একটি রেজোলিউশন অভিপ্রায় ধারণকারী একটি ConnectionResult onConnectionFailed() কলব্যাকে বিতরণ করা হয়। API সংযোগ ব্যর্থতা উপেক্ষা করা হয় শুধুমাত্র যদি ব্যর্থতার জন্য কোন রেজোলিউশন না থাকে এবং API যোগ করা হয় addApiIfAvailable() এর সাথে। ম্যানুয়াল সংযোগ ব্যর্থতা হ্যান্ডলিং কিভাবে বাস্তবায়ন করতে হয় তা শিখতে, হ্যান্ডেল সংযোগ ব্যর্থতা দেখুন।

যেহেতু addApiIfAvailable() এর সাথে যোগ করা API গুলি সবসময় সংযুক্ত GoogleApiClient ইনস্ট্যান্সে উপস্থিত নাও থাকতে পারে, hasConnectedApi() ব্যবহার করে একটি চেক যোগ করে আপনার এই APIগুলিতে কলগুলি রক্ষা করা উচিত। ক্লায়েন্টের জন্য সম্পূর্ণ সংযোগ অপারেশন সফল হলে কেন একটি নির্দিষ্ট API সংযোগ করতে ব্যর্থ হয়েছে তা জানতে, getConnectionResult() কল করুন এবং ConnectionResult অবজেক্ট থেকে ত্রুটি কোড পান। যদি আপনার ক্লায়েন্ট একটি API কল করে যখন এটি ক্লায়েন্টের সাথে সংযুক্ত না থাকে, কলটি API_NOT_AVAILABLE স্ট্যাটাস কোডের সাথে ব্যর্থ হয়।

আপনি addApiIfAvailable() এর মাধ্যমে যে API যোগ করছেন তার জন্য যদি এক বা একাধিক স্কোপের প্রয়োজন হয়, তাহলে addScope() পদ্ধতি ব্যবহার না করে আপনার addApiIfAvailable() পদ্ধতি কলে প্যারামিটার হিসেবে সেই স্কোপগুলি যোগ করুন। OAuth সম্মতি পাওয়ার আগে API সংযোগ ব্যর্থ হলে এই পদ্ধতি ব্যবহার করে যোগ করা স্কোপের অনুরোধ করা নাও হতে পারে, যেখানে addScope() এর সাথে যোগ করা স্কোপ সবসময় অনুরোধ করা হয়।

ম্যানুয়ালি পরিচালিত সংযোগ

স্বয়ংক্রিয়ভাবে সমাধান করা ত্রুটিগুলির সাথে একটি স্বয়ংক্রিয়ভাবে পরিচালিত সংযোগ শুরু করতে enableAutoManage পদ্ধতিটি কীভাবে ব্যবহার করবেন তা এই গাইডের বেশিরভাগই আপনাকে দেখায়৷ প্রায় সব ক্ষেত্রেই, এটি আপনার Android অ্যাপ থেকে Google API-এর সাথে সংযোগ করার সেরা এবং সহজ উপায়। যাইহোক, এমন কিছু পরিস্থিতি রয়েছে যেখানে আপনি আপনার অ্যাপে Google API-এর সাথে ম্যানুয়ালি পরিচালিত সংযোগ ব্যবহার করতে চান:

  • কোনো কার্যকলাপের বাইরে Google API অ্যাক্সেস করতে বা API সংযোগের নিয়ন্ত্রণ ধরে রাখতে
  • সংযোগ ত্রুটি পরিচালনা এবং রেজোলিউশন কাস্টমাইজ করতে

এই বিভাগটি এই এবং অন্যান্য উন্নত ব্যবহারের ক্ষেত্রে উদাহরণ প্রদান করে।

একটি ম্যানুয়ালি পরিচালিত সংযোগ শুরু করুন

GoogleApiClient এ একটি ম্যানুয়ালি পরিচালিত সংযোগ শুরু করতে, আপনাকে অবশ্যই কলব্যাক ইন্টারফেস, ConnectionCallbacks এবং OnConnectionFailedListener জন্য একটি বাস্তবায়ন নির্দিষ্ট করতে হবে। এই ইন্টারফেসগুলি অ্যাসিঙ্ক্রোনাস connect() পদ্ধতির প্রতিক্রিয়া হিসাবে কলব্যাক গ্রহণ করে যখন Google Play পরিষেবাগুলির সংযোগ সফল হয়, ব্যর্থ হয় বা স্থগিত হয়৷

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Drive.API)
            .addScope(Drive.SCOPE_FILE)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build()

ম্যানুয়ালি একটি সংযোগ পরিচালনা করার সময় আপনাকে আপনার অ্যাপের জীবনচক্রের সঠিক পয়েন্টে connect() এবং disconnect() পদ্ধতিতে কল করতে হবে। একটি কার্যকলাপের প্রেক্ষাপটে আপনার কার্যকলাপের onStart() পদ্ধতিতে connect() এবং আপনার কার্যকলাপের onStop() পদ্ধতিতে disconnect() কল করা সর্বোত্তম অনুশীলন। একটি স্বয়ংক্রিয়ভাবে পরিচালিত সংযোগ ব্যবহার করার সময় connect() এবং disconnect() পদ্ধতিগুলি স্বয়ংক্রিয়ভাবে কল করা হয়।

আপনি যদি GoogleApiClient ব্যবহার করেন এমন API-এর সাথে সংযোগ করার জন্য যেগুলির জন্য প্রমাণীকরণের প্রয়োজন হয়, যেমন Google ড্রাইভ বা Google Play Games, তাহলে আপনার প্রথম সংযোগ প্রচেষ্টা ব্যর্থ হওয়ার একটি ভাল সম্ভাবনা রয়েছে এবং আপনার অ্যাপটি SIGN_IN_REQUIRED ত্রুটি সহ onConnectionFailed() এ একটি কল পাবে কারণ ব্যবহারকারীর অ্যাকাউন্ট নির্দিষ্ট করা হয়নি।

সংযোগ ব্যর্থতা হ্যান্ডেল

যখন আপনার অ্যাপ onConnectionFailed() কলব্যাকে একটি কল পায়, তখন আপনাকে প্রদত্ত ConnectionResult অবজেক্টে hasResolution() কল করতে হবে। যদি এটি সত্য হয়, তাহলে আপনার অ্যাপ ব্যবহারকারীকে অনুরোধ করতে পারে যে ConnectionResult অবজেক্টে startResolutionForResult() কল করে ত্রুটিটি সমাধান করার জন্য অবিলম্বে ব্যবস্থা নেওয়ার জন্য। startResolutionForResult() পদ্ধতিটি এই পরিস্থিতিতে startActivityForResult() এর মতোই আচরণ করে, এবং প্রেক্ষাপটের সাথে উপযুক্ত একটি কার্যকলাপ চালু করে যা ব্যবহারকারীকে ত্রুটিটি সমাধান করতে সহায়তা করে (যেমন একটি কার্যকলাপ যা ব্যবহারকারীকে একটি অ্যাকাউন্ট নির্বাচন করতে সহায়তা করে)।

যদি hasResolution() মিথ্যা প্রত্যাবর্তন করে, আপনার অ্যাপটিকে GoogleApiAvailability.getErrorDialog() কল করা উচিত, এই পদ্ধতিতে ত্রুটি কোডটি পাস করা উচিত। এটি Google Play পরিষেবাগুলির দ্বারা প্রদত্ত একটি Dialog প্রদান করে যা ত্রুটির জন্য উপযুক্ত৷ ডায়ালগটি কেবল ত্রুটি ব্যাখ্যা করে একটি বার্তা প্রদান করতে পারে, অথবা এটি এমন একটি ক্রিয়াকলাপ চালু করার জন্য একটি ক্রিয়াও সরবরাহ করতে পারে যা ত্রুটিটি সমাধান করতে পারে (যেমন যখন ব্যবহারকারীর Google Play পরিষেবাগুলির একটি নতুন সংস্করণ ইনস্টল করার প্রয়োজন হয়)৷

উদাহরণস্বরূপ, আপনার onConnectionFailed() কলব্যাক পদ্ধতিটি এখন এইরকম হওয়া উচিত:

public class MyActivity extends Activity
        implements ConnectionCallbacks, OnConnectionFailedListener {

    // Request code to use when launching the resolution activity
    private static final int REQUEST_RESOLVE_ERROR = 1001;
    // Unique tag for the error dialog fragment
    private static final String DIALOG_ERROR = "dialog_error";
    // Bool to track whether the app is already resolving an error
    private boolean mResolvingError = false;

    // ...

    @Override
    public void onConnectionFailed(ConnectionResult result) {
        if (mResolvingError) {
            // Already attempting to resolve an error.
            return;
        } else if (result.hasResolution()) {
            try {
                mResolvingError = true;
                result.startResolutionForResult(this, REQUEST_RESOLVE_ERROR);
            } catch (SendIntentException e) {
                // There was an error with the resolution intent. Try again.
                mGoogleApiClient.connect();
            }
        } else {
            // Show dialog using GoogleApiAvailability.getErrorDialog()
            showErrorDialog(result.getErrorCode());
            mResolvingError = true;
        }
    }

    // The rest of this code is all about building the error dialog

    /* Creates a dialog for an error message */
    private void showErrorDialog(int errorCode) {
        // Create a fragment for the error dialog
        ErrorDialogFragment dialogFragment = new ErrorDialogFragment();
        // Pass the error that should be displayed
        Bundle args = new Bundle();
        args.putInt(DIALOG_ERROR, errorCode);
        dialogFragment.setArguments(args);
        dialogFragment.show(getSupportFragmentManager(), "errordialog");
    }

    /* Called from ErrorDialogFragment when the dialog is dismissed. */
    public void onDialogDismissed() {
        mResolvingError = false;
    }

    /* A fragment to display an error dialog */
    public static class ErrorDialogFragment extends DialogFragment {
        public ErrorDialogFragment() { }

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            // Get the error code and retrieve the appropriate dialog
            int errorCode = this.getArguments().getInt(DIALOG_ERROR);
            return GoogleApiAvailability.getInstance().getErrorDialog(
                    this.getActivity(), errorCode, REQUEST_RESOLVE_ERROR);
        }

        @Override
        public void onDismiss(DialogInterface dialog) {
            ((MyActivity) getActivity()).onDialogDismissed();
        }
    }
}

ব্যবহারকারী startResolutionForResult() দ্বারা প্রদত্ত ডায়ালগটি সম্পূর্ণ করার পরে বা GoogleApiAvailability.getErrorDialog() দ্বারা প্রদত্ত বার্তাটি খারিজ করার পরে, আপনার কার্যকলাপ RESULT_OK ফলাফল কোড সহ onActivityResult() কলব্যাক পায়৷ আপনার অ্যাপ তারপর আবার connect() কল করতে পারে। যেমন:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_RESOLVE_ERROR) {
        mResolvingError = false;
        if (resultCode == RESULT_OK) {
            // Make sure the app is not already connected or attempting to connect
            if (!mGoogleApiClient.isConnecting() &&
                    !mGoogleApiClient.isConnected()) {
                mGoogleApiClient.connect();
            }
        }
    }
}

উপরের কোডে, আপনি সম্ভবত বুলিয়ান, mResolvingError লক্ষ্য করেছেন। ব্যবহারকারী একই ত্রুটি সমাধানের পুনরাবৃত্তিমূলক প্রচেষ্টা এড়াতে ত্রুটিটি সমাধান করার সময় এটি অ্যাপের অবস্থার উপর নজর রাখে। উদাহরণস্বরূপ, যখন ব্যবহারকারীকে SIGN_IN_REQUIRED ত্রুটি সমাধানে সহায়তা করার জন্য অ্যাকাউন্ট পিকার ডায়ালগ প্রদর্শিত হয়, তখন ব্যবহারকারী স্ক্রীনটি ঘোরাতে পারেন৷ এটি আপনার ক্রিয়াকলাপ পুনরায় তৈরি করে এবং আপনার onStart() পদ্ধতিকে আবার কল করার কারণ হয়, যা আবার connect() কল করে। এর ফলে startResolutionForResult() এ আরেকটি কল আসে, যা বিদ্যমান একটির সামনে আরেকটি অ্যাকাউন্ট পিকার ডায়ালগ তৈরি করে।

এই বুলিয়ান শুধুমাত্র যদি এটি কার্যকলাপের দৃষ্টান্ত জুড়ে অব্যাহত থাকে তবেই তার উদ্দিষ্ট উদ্দেশ্য পূরণ করে। পরবর্তী বিভাগটি ব্যাখ্যা করে যে ডিভাইসে অন্যান্য ব্যবহারকারীর ক্রিয়া বা ইভেন্ট হওয়া সত্ত্বেও কীভাবে আপনার অ্যাপের ত্রুটি পরিচালনার অবস্থা বজায় রাখা যায়।

একটি ত্রুটি সমাধান করার সময় অবস্থা বজায় রাখুন

একটি ত্রুটি সমাধানের পূর্ববর্তী প্রচেষ্টা চলাকালীন onConnectionFailed() এ কোডটি কার্যকর করা এড়াতে, আপনাকে একটি বুলিয়ান রাখতে হবে যা ট্র্যাক করে যে আপনার অ্যাপ ইতিমধ্যেই একটি ত্রুটি সমাধান করার চেষ্টা করছে কিনা।

উপরের কোডের উদাহরণে যেমন দেখানো হয়েছে, আপনার অ্যাপটি প্রত্যেকবার startResolutionForResult() কল করলে বা GoogleApiAvailability.getErrorDialog() থেকে ডায়ালগ প্রদর্শন করার সময় একটি বুলিয়ানকে true সেট করা উচিত। তারপর, যখন আপনার অ্যাপ onActivityResult() কলব্যাকে RESULT_OK পায়, তখন বুলিয়ানকে false সেট করুন।

অ্যাক্টিভিটি রিস্টার্ট জুড়ে বুলিয়ানের ট্র্যাক রাখতে (যেমন ব্যবহারকারী যখন স্ক্রিন ঘোরে), onSaveInstanceState() ব্যবহার করে কার্যকলাপের সংরক্ষিত ইনস্ট্যান্স ডেটাতে বুলিয়ান সংরক্ষণ করুন :

private static final String STATE_RESOLVING_ERROR = "resolving_error";

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean(STATE_RESOLVING_ERROR, mResolvingError);
}

তারপর onCreate() সময় সংরক্ষিত অবস্থা পুনরুদ্ধার করুন:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // ...
    mResolvingError = savedInstanceState != null
            && savedInstanceState.getBoolean(STATE_RESOLVING_ERROR, false);
}

এখন আপনি নিরাপদে আপনার অ্যাপ চালাতে এবং Google Play পরিষেবার সাথে ম্যানুয়ালি সংযোগ করতে প্রস্তুত৷