Android पर Tasks API का इस्तेमाल करना

चेतावनी: इस दस्तावेज़ का इस्तेमाल नहीं किया जा सकता. OAuth 2.0 का इस्तेमाल करके, Android ऐप्लिकेशन को अनुमति देने के बारे में जानने के लिए, कृपया Android Play services की अनुमति से जुड़ा दस्तावेज़ देखें.

इस दस्तावेज़ में, Android पर OAuth 2.0 के साथ Tasks API का इस्तेमाल करने का तरीका बताया गया है. इसमें, उपयोगकर्ता के Google Tasks को ऐक्सेस करने के लिए अनुमति देने के तरीकों के बारे में बताया गया है. साथ ही, यह भी बताया गया है कि अपने Android ऐप्लिकेशन में, इस्तेमाल के लिए तैयार Tasks API सेवा ऑब्जेक्ट कैसे पाया जा सकता है.

आपके Android ऐप्लिकेशन के लिए, Tasks API का इस्तेमाल करने के लिए कई चरणों की ज़रूरत होती है. इसके लिए, आपको:

  1. उपयोगकर्ता का Google खाता चुनें
  2. Task API के लिए, AccountManager से OAuth 2.0 ऐक्सेस टोकन पाना
  3. अपने प्रोजेक्ट की पहचान करना और Tasks का सेवा ऑब्जेक्ट सेट अप करना
  4. Tasks API को कॉल करना

Google की क्लाइंट लाइब्रेरी इंपोर्ट करना

इस दस्तावेज़ में आपको जो सैंपल मिलेंगे उनमें Java के लिए Google APIs क्लाइंट लाइब्रेरी का इस्तेमाल किया गया है. आपको अपने Android ऐप्लिकेशन में ये jar जोड़ने होंगे. इसके लिए, नीचे दिए गए jar को अपने Android ऐप्लिकेशन के रूट में मौजूद /assets फ़ोल्डर में डालें. इस दस्तावेज़ के पुराने होने पर, नए वर्शन भी देखें.

Google APIs क्लाइंट लाइब्रेरी के jar और उसके Android एक्सटेंशन इंपोर्ट करें. ये सभी google-api-java-client-1.4.1-beta.zip का हिस्सा हैं:

  • google-api-client-1.4.1-beta.jar
  • google-api-client-extensions-android2-1.4.1-beta.jar
  • google-api-client-googleapis-1.4.1-beta.jar
  • google-api-client-googleapis-extensions-android2-1.4.1-beta.jar

Tasks के लिए खास तौर पर बनाया गया jar इंपोर्ट करें:

डिपेंडेंसी इंपोर्ट करें (google-api-java-client-1.4.1-beta.zip का पूरा हिस्सा):

  • commons-codec-1.3.jar
  • gson-1.6.jar
  • guava-r09.jar
  • httpclient-4.0.3.jar
  • httpcore-4.0.1.jar
  • jackson-core-asl-1.6.7.jar
  • jsr305-1.3.9.jar

Android में Google खाते

Android 2.0 के बाद से, AccountManager उन खातों को मैनेज करता है जिन्हें आपने अपने एनवायरमेंट में रजिस्टर किया है. ये खाते, सेटिंग > खाते और सिंक में दिखते हैं. खास तौर पर, यह अनुमति देने के फ़्लो को मैनेज करता है. साथ ही, एपीआई का इस्तेमाल करके डेटा ऐक्सेस करने के लिए ज़रूरी अनुमति टोकन जनरेट कर सकता है.

आपके Android एनवायरमेंट में रजिस्टर किए गए खाते
आपके Android एनवायरमेंट में रजिस्टर किए गए खाते

खाते पाने और अनुमति वाले टोकन का अनुरोध करने के लिए, AccountManager का इस्तेमाल करने के लिए, आपको अपने Android ऐप्लिकेशन मेनिफ़ेस्ट में ये अनुमतियां जोड़नी होंगी:

<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />

Tasks को उस Google खाते से ऐक्सेस करने के लिए, AccountManager का इस्तेमाल किया जा सकता है. AccountManager, न सिर्फ़ Google खातों को मैनेज करता है, बल्कि अन्य वेंडर के खातों को भी मैनेज करता है. इसलिए, आपको नीचे दिए गए कोड का इस्तेमाल करके, Google खातों के लिए खास तौर पर अनुरोध करना होगा:

AccountManager accountManager = AccountManager.get(activity);
Account[] accounts = accountManager.getAccountsByType("com.google");

इसके अलावा, Java के लिए Google API क्लाइंट लाइब्रेरी में GoogleAccountManager भी शामिल है. यह सिर्फ़ Google खातों को मैनेज करता है:

GoogleAccountManager googleAccountManager = new GoogleAccountManager(activity);
Account[] accounts = googleAccountManager.getAccounts();

अगर Android डिवाइस पर एक से ज़्यादा Google खाते उपलब्ध हैं, तो आपको उपयोगकर्ता से यह पूछना चाहिए कि वह किस खाते का इस्तेमाल करना चाहता है. इसके लिए, आपको एक डायलॉग बॉक्स दिखाना होगा, जो कुछ ऐसा दिख सकता है:

खाता चुनने वाला डायलॉग
खाता चुनने वाला डायलॉग

अपनी गतिविधि के onCreateDialog तरीके में, नीचे दिए गए स्विच/केस कोड का इस्तेमाल करके, ऐसा डायलॉग बनाया जा सकता है:

@Override
protected Dialog onCreateDialog(int id) {
  switch (id) {
    case DIALOG_ACCOUNTS:
      AlertDialog.Builder builder = new AlertDialog.Builder(this);
      builder.setTitle("Select a Google account");
      final Account[] accounts = accountManager.getAccountsByType("com.google");
      final int size = accounts.length;
      String[] names = new String[[]size];
      for (int i = 0; i < size; i++) {
        names[[]i] = accounts[[]i].name;
      }
      builder.setItems(names, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
          // Stuff to do when the account is selected by the user
          gotAccount(accounts[[]which]);
        }
      });
      return builder.create();
  }
  return null;
}

showDialog(DIALOG_ACCOUNTS) को कॉल करने पर, खाता चुनने वाला डायलॉग दिखेगा.

Android पर Google API की अनुमति देने का फ़्लो

उपयोगकर्ता ने खाता चुन लिया है. अब हम AccountManager से Task API के लिए OAuth 2.0 ऐक्सेस टोकन जारी करने के लिए कह सकते हैं. ऐसा करने के लिए, AccountManager.getAuthToken() तरीके को कॉल करें. AccountManager.getAuthToken() कॉल के दौरान, AccountManager, Google API के अनुमति वाले एंडपॉइंट से संपर्क करेगा. जब AccountManager को अनुमति वाला टोकन मिल जाएगा, तो वह AccountManagerCallback को चलाएगा. आपने इसे, मेथड कॉल में तय किया है:

manager.getAuthToken(account, AUTH_TOKEN_TYPE, null, activity, new AccountManagerCallback<Bundle>() {
    public void run(AccountManagerFuture<Bundle> future) {
      try {
        // If the user has authorized your application to use the tasks API
        // a token is available.
        String token = future.getResult().getString(AccountManager.KEY_AUTHTOKEN);
        // Now you can use the Tasks API...
        useTasksAPI(token);
      } catch (OperationCanceledException e) {
        // TODO: The user has denied you access to the API, you should handle that
      } catch (Exception e) {
        handleException(e);
      }
    }
  }, null);

जैसा कि आपको पहले से पता हो, Android AccountManager में OAuth 2.0 के लिए एक्सपेरिमेंट के तौर पर सहायता उपलब्ध है. AUTH_TOKEN_TYPE सेट करते समय, आपको जिस एपीआई को ऐक्सेस करना है उसके स्कोप के आगे oauth2: जोड़ना होगा. इसलिए, Tasks API के लिए इनका इस्तेमाल किया जा सकता है:

String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/tasks";

ऊपर दी गई वैल्यू को AUTH_TOKEN_TYPE के तौर पर इस्तेमाल करने पर समस्या यह होती है कि अनुमति वाले डायलॉग बॉक्स में, स्ट्रिंग oauth2:https://www.googleapis.com/auth/tasks, उस Google प्रॉडक्ट के नाम के तौर पर दिखेगी जिसे आपको ऐक्सेस करना है. इस समस्या को हल करने के लिए, Tasks API के लिए AUTH_TOKEN_TYPE के खास — ऐसेनी — उपनाम मौजूद हैं जिन्हें कोई भी पढ़ सकता है. ये OAuth 2.0 स्कोप का इस्तेमाल करने के बराबर हैं. उदाहरण के लिए, इनका इस्तेमाल किया जा सकता है:

String AUTH_TOKEN_TYPE = "Manage your tasks";

AUTH_TOKEN_TYPE के उपनाम के तौर पर, अपने टास्क देखें का इस्तेमाल भी किया जा सकता है. यह Tasks API के रीड-ओनली स्कोप के बराबर है: oauth2:https://www.googleapis.com/auth/tasks.readonly.

AccountManager.getAuthToken() कॉल के दौरान, AccountManager यह जांच करेगा कि आपके ऐप्लिकेशन को Tasks API को ऐक्सेस करने की अनुमति मिली है या नहीं. अगर आपके ऐप्लिकेशन को अब तक अनुमति नहीं मिली है, तो AccountManager एक गतिविधि शुरू करता है. इसमें उपयोगकर्ता को अनुमति देने वाला डायलॉग बॉक्स दिखता है, ताकि वह अपने खाते पर Tasks API का इस्तेमाल करने के लिए, आपके ऐप्लिकेशन को अनुमति या अनुमति न दें.

प्राधिकरण संवाद
प्राधिकरण संवाद

अगर उपयोगकर्ता आपके ऐप्लिकेशन को Tasks API का ऐक्सेस देने से मना कर देता है, तो future.getResult() कॉल के दौरान, OperationCanceledException का एक अपवाद मिलेगा. आपको इस समस्या को आसानी से हल करना चाहिए. उदाहरण के लिए, खाता फिर से चुनने के लिए कहें या ऐक्सेस की अनुमति देने के लिए बटन के साथ मैसेज दिखाएं.

अपने ऐप्लिकेशन की पहचान करना और Tasks API सेवा ऑब्जेक्ट को सेट अप करना

अब आपके ऐप्लिकेशन के पास Tasks API को ऐक्सेस करने की अनुमति है और उसे ऐक्सेस टोकन भी मिल गया है. हालांकि, आपको एक एपीआई पासकोड भी चाहिए. यह पासकोड, Google API कंसोल में मौजूद किसी प्रोजेक्ट से लिया जा सकता है. ऐसा इसलिए ज़रूरी है, क्योंकि Tasks API कॉल करने के लिए यह पासकोड होना चाहिए. इसके लिए, यह तरीका अपनाएं:

  1. प्रोजेक्ट बनाना या किसी मौजूदा प्रोजेक्ट का इस्तेमाल करना
  2. Tasks API स्विच को चालू करें पर टॉगल करके, अपने प्रोजेक्ट पर Tasks API को चालू करें
  3. एपीआई पासकोड, एपीआई ऐक्सेस > आसान एपीआई ऐक्सेस > एपीआई पासकोड पर देखा जा सकता है

API कंसोल से एपीआई पासकोड पाना
API कंसोल से एपीआई पासकोड पाना

एपीआई पासकोड देना ज़रूरी है, क्योंकि इससे आपके ऐप्लिकेशन की पहचान होती है. इसलिए, एपीआई को कोटा काटने और आपके प्रोजेक्ट के लिए तय किए गए कोटा के नियमों का इस्तेमाल करने की अनुमति मिलती है. आपको Tasks के service ऑब्जेक्ट में एपीआई पासकोड की जानकारी देनी होगी:

useTasksAPI(String accessToken) {
  // Setting up the Tasks API Service
  HttpTransport transport = AndroidHttp.newCompatibleTransport();
  AccessProtectedResource accessProtectedResource = new GoogleAccessProtectedResource(accessToken);
  Tasks service = new Tasks(transport, accessProtectedResource, new JacksonFactory());
  service.accessKey = INSERT_YOUR_API_KEY;
  service.setApplicationName("Google-TasksSample/1.0");

  // TODO: now use the service to query the Tasks API
}

accessToken सिर्फ़ कुछ समय के लिए मान्य होता है. इसलिए, इसकी समयसीमा खत्म होने पर आपको नया ऐक्सेस लेना होगा. इसे ठीक करने के दो तरीके हैं:

  • हर बार एपीआई के ज़रिए अनुरोध करते समय, AccountManager से accessToken का अनुरोध करें. AccountManager, टोकन को कैश मेमोरी में सेव करता है. इसलिए, यह समाधान स्वीकार किया जा सकता है.
  • accessToken का इस्तेमाल तब तक करते रहें, जब तक आपको 403 गड़बड़ी का कोड न दिखे. इसके बाद, AccountManager से नया टोकन मांगें.

एपीआई की मदद से टास्क में बदलाव करना

इस समय, आपके पास Tasks API सेवा का पूरी तरह से सेट अप किया गया ऑब्जेक्ट होना चाहिए. इसका इस्तेमाल, Tasks API डेवलपर गाइड के मुताबिक एपीआई से क्वेरी करने के लिए किया जा सकता है. उदाहरण के लिए:

// Getting all the Task lists
List taskLists = service.tasklists.list().execute().items;

// Getting the list of tasks in the default task list
List tasks = service.tasks.list("@default").execute().items;

// Add a task to the default task list
Task task = new Task();
task.title = "New Task";
task.notes = "Please complete me";
task.due = "2010-10-15T12:00:00.000Z";
Task result = service.tasks.insert("@default", task).execute();

अपने Android ऐप्लिकेशन मेनिफ़ेस्ट में, इंटरनेट ऐक्सेस करने की अनुमति जोड़ना न भूलें. ऐसा न करने पर, Tasks API के एंडपॉइंट के लिए ऊपर दिए गए अनुरोध काम नहीं करेंगे:

<uses-permission android:name="android.permission.INTERNET" />

आवेदन का सैंपल

हमने हाल ही में, Java के लिए Google API क्लाइंट लाइब्रेरी के सैंपल रिपॉज़िटरी में एक नया सैंपल जोड़ा है. इससे आपको Android पर Tasks API और OAuth 2.0 का इस्तेमाल शुरू करने में मदद मिलेगी. यह सैंपल एक आसान, लेकिन पूरी तरह से काम करने वाला Android ऐप्लिकेशन है. यह Tasks API का इस्तेमाल करने की अनुमति का अनुरोध करता है और ListView में डिफ़ॉल्ट टास्क की सूची के टास्क दिखाता है.

टास्क की डिफ़ॉल्ट सूची में मौजूद टास्क को ListView में दिखाना
टास्क की डिफ़ॉल्ट सूची में मौजूद टास्क को ListView में दिखाना

सैंपल को चलाने के लिए, इन निर्देशों का पालन करें. साथ ही, Google Tasks API फ़ोरम पर अपने सुझाव/राय या सवाल पोस्ट करने में संकोच न करें.