7

पर Google कैलेंडर API OAuth2 समस्याएं मैं एंड्रॉइड हनीकॉम (v3.0) एप्लिकेशन पर काम कर रहा हूं जिसमें Google कैलेंडर API के साथ संचार करने की आवश्यकता है। मैं ईवेंट को पढ़ने और बनाने के लिए अपने एप्लिकेशन को किसी विशेष Google खाते के कैलेंडर डेटा तक पहुंचने की अनुमति देना चाहता हूं।एंड्रॉइड हनीकॉम

दुर्भाग्यवश, मैं OAuth2 का उपयोग करके प्राधिकरण के साथ एक समस्या में भाग गया। यहां मेरे पास अब तक है:

1) Google खाता जिसका कैलेंडर मैं एक्सेस करना चाहता हूं वह एंड्रॉइड डिवाइस के भीतर पंजीकृत है जिसके साथ मैं काम कर रहा हूं।

2) मैंने खाते में Google API कंसोल के भीतर कैलेंडर API सक्षम किया।

3) मैं निम्नलिखित कोड का उपयोग कर इस खाते में प्रवेश करने में सक्षम हूँ:

AccountManager accountManager = AccountManager.get(this.getBaseContext()); 
Account[] accounts = accountManager.getAccountsByType("com.google"); 
Account acc = accounts[0]; // The device only has one account on it 

4) अब मैं जब कैलेंडर के साथ संवाद स्थापित उपयोग के लिए एक AuthToken प्राप्त करने के लिए करना चाहते हैं। मैंने इस tutorial का पालन किया, लेकिन Google कार्य के बजाय Google कैलेंडर के साथ काम करने के लिए सबकुछ परिवर्तित कर दिया। मैंने AccountManager से authToken को सफलतापूर्वक पुनर्प्राप्त किया है जिसका खाता मैं getAuthTokenAUTH_TOKEN_TYPE == "oauth2:https://www.googleapis.com/auth/calendar" के साथ उपयोग करके उपयोग करना चाहता हूं।

5) यहां समस्याएं शुरू होती हैं। मैं इस बिंदु पर अब कर रहा हूँ:

AccessProtectedResource accessProtectedResource = new GoogleAccessProtectedResource(tokens[0]); // this is the correct token 
HttpTransport transport = AndroidHttp.newCompatibleTransport(); 
Calendar service = Calendar.builder(transport, new JacksonFactory()) 
    .setApplicationName("My Application's Name") 
    .setHttpRequestInitializer(accessProtectedResource) 
    .build(); 
service.setKey("myCalendarSimpleAPIAccessKey"); // This is deprecated??? 
Events events = service.events().list("primary").execute(); // Causes an exception! 

6) यहाँ अपवाद अंतिम पंक्ति द्वारा दिया गया है:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden 
{ 
    "code" : 403, 
    "errors" : [ { 
    "domain" : "usageLimits", 
    "message" : "Daily Limit Exceeded. Please sign up", 
    "reason" : "dailyLimitExceededUnreg", 
    "extendedHelp" : "https://code.google.com/apis/console" 
    } ], 
    "message" : "Daily Limit Exceeded. Please sign up" 
} 

7) इस Google API Video के अनुसार (एक मिनट प्रतीक्षा या तो लागू सामग्री को पाने के लिए), इस अपवाद का एक कारण यह तथ्य हो सकता है कि मैंने खाते के लिए Google API कंसोल में API एक्सेस को सक्षम नहीं किया है। हालांकि, अगर आप 2 देखते हैं), तो आप देख सकते हैं कि मैंने ऐसा किया है।

8) मेरे लिए, ऐसा लगता है कि समस्या यह है कि मैं सरल API एक्सेस कुंजी को सही ढंग से सेट करने में असमर्थ था, क्योंकि Calendar.setKey विधि बहिष्कृत है। Google कार्य ट्यूटोरियल के भीतर जो मैंने पहले लिंक किया था, कुंजी Tasks.accessKey = "key" का उपयोग करके सेट की गई है। मुझे यकीन नहीं है कि कैलेंडर एपीआई के साथ यह कैसे काम करना है, हालांकि। मैंने कई Google खातों की कोशिश की है, जो सभी 5 से अपवाद के साथ आए थे)।

9) मैं यह इंगित करना चाहता हूं कि OAuth2 का उपयोग करने की पारंपरिक विधि मेरे लिए काम करती है। यहाँ कोड मैं उस के लिए इस्तेमाल किया है:

HttpTransport TRANSPORT = new NetHttpTransport(); 
JsonFactory JSON_FACTORY = new JacksonFactory(); 
String SCOPE = "https://www.googleapis.com/auth/calendar"; 
String CALLBACK_URL = "urn:ietf:wg:oauth:2.0:oob"; 
String CLIENT_ID = "myClientID"; 
String CLIENT_SECRET = "myClientSecret"; 
String authorizeUrl = new GoogleAuthorizationRequestUrl(CLIENT_ID, CALLBACK_URL, SCOPE).build(); 
String authorizationCode = "???"; // At this point, I have to manually go to the authorizeUrl and grab the authorization code from there to paste it in here while in debug mode 

GoogleAuthorizationCodeGrant authRequest = new GoogleAuthorizationCodeGrant(TRANSPORT, JSON_FACTORY, CLIENT_ID, CLIENT_SECRET, authorizationCode, CALLBACK_URL); 
authRequest.useBasicAuthorization = false; 
AccessTokenResponse authResponse = authRequest.execute(); 
String accessToken = authResponse.accessToken; // gets the correct token 

GoogleAccessProtectedResource access = new GoogleAccessProtectedResource(accessToken, TRANSPORT, JSON_FACTORY, CLIENT_ID, CLIENT_SECRET, authResponse.refreshToken); 
HttpRequestFactory rf = TRANSPORT.createRequestFactory(access); 
AccessProtectedResource accessProtectedResource = new GoogleAccessProtectedResource(accessToken); 
HttpTransport transport = AndroidHttp.newCompatibleTransport(); 

Calendar service = Calendar.builder(transport, new JacksonFactory()) 
    .setApplicationName("My Application's Name") 
    .setHttpRequestInitializer(accessProtectedResource) 
    .build(); 

Events events = service.events().list("primary").execute(); // this works! 

10) अंत में, मेरे सवाल: मैं Google कैलेंडर के साथ प्रयोग के लिए एक काम कर OAuth2 टोकन प्राप्त करने में डिवाइस पर ही खाता प्रबंधक से खाते का उपयोग करना चाहते हैं एपीआई। दूसरी विधि मेरे लिए उपयोगी नहीं है, क्योंकि उपयोगकर्ता को मैन्युअल रूप से अपने वेब ब्राउज़र पर जाना होगा और प्राधिकरण कोड प्राप्त करना होगा, जो उपयोगकर्ता के अनुकूल नहीं है। क्या किसी के भी पास कोई सुझाव है? लंबी पोस्ट के लिए माफ़ी, और धन्यवाद!

+0

हाय, मैं ने वही समस्या का सामना करना पड़ रहा हूँ, मैं इस कोड के टुकड़े इस्तेमाल किया एक कैलेंडर अनुप्रयोग चलाने के लिए है, लेकिन फिर मैं एक 403 मिलता है , प्रतिबंधित त्रुटि का उपयोग, सह उल कृपया आप सहायता करें, मुझे एंड्रॉइड में क्या करना चाहिए? हालांकि मैं नंबर 8 का उपयोग किसी विकल्प के रूप में नहीं कर रहा हूं। कृपया एचएलपी। –

+0

आप एक विकल्प के रूप में क्या उपयोग कर रहे हैं? क्या आपने @ eltrl के उत्तर की जांच की है? – BVB

उत्तर

4

बिल्डर के लिए एक JsonHttpRequestInitializer जोड़ने और आपकी कुंजी सेट करके देखें:

Calendar service = Calendar.builder(transport, new JacksonFactory()) 
.setApplicationName("My Application's Name") 
.setHttpRequestInitializer(accessProtectedResource) 
.setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() { 
    public void initialize(JsonHttpRequest request) { 
     CalendarRequest calRequest = (CalendarRequest) request; 
     calRequest.setKey("myCalendarSimpleAPIAccessKey"); 
    } 

}).build(); 
+0

धन्यवाद, लेकिन मुझे ग्रहण में निम्न त्रुटि मिल रही है: 'विधि सेट जेसनएचटीपीआरक्वेटइनेनाइज़र (जेसन एचटीपीआरक्वेटइनेनाइज़र) प्रकार कैलेंडर में। बिल्डर तर्कों के लिए लागू नहीं है (नया जेसनएचटीपीआरक्वेटइनेनाइज़र() {}) ' – BVB

+0

ओह, मैंने त्रुटि तय की (आयात समस्या) और यह काम किया! आपका बहुत धन्यवाद! – BVB

+1

कोई समस्या नहीं, दस्तावेजों के वर्तमान (बीटा) राज्य को दिए गए निदान के लिए ये चीजें बहुत तुच्छ नहीं हैं। – eltrl

1

उत्तर देने के लिए कोई 10: मैं मूल रूप से आप TaskSample के साथ काम करना था कि क्या करना है और फिर Android का उपयोग किया है GData कैलेंडर नमूना यहाँ उपलब्ध है: http://code.google.com/p/google-api-java-client/source/browse/calendar-android-sample/src/main/java/com/google/api/client/sample/calendar/android/CalendarSample.java?repo=samples खाता प्रबंधक से ही AuthToken पाने के लिए:

accountManager = new GoogleAccountManager(this); 
settings = this.getSharedPreferences(PREF, 0); 
gotAccount(); 

private void gotAccount() { 
     Account account = accountManager.getAccountByName(accountName); 
     if (account != null) { 
      if (settings.getString(PREF_AUTH_TOKEN, null) == null) { 
       accountManager.manager.getAuthToken(account, AUTH_TOKEN_TYPE, 
         true, new AccountManagerCallback<Bundle>() { 

          @Override 
          public void run(AccountManagerFuture<Bundle> future) { 
           try { 
            Bundle bundle = future.getResult(); 
            if (bundle 
              .containsKey(AccountManager.KEY_INTENT)) { 
             Intent intent = bundle 
               .getParcelable(AccountManager.KEY_INTENT); 
             int flags = intent.getFlags(); 
             flags &= ~Intent.FLAG_ACTIVITY_NEW_TASK; 
             intent.setFlags(flags); 
             startActivityForResult(intent, 
               REQUEST_AUTHENTICATE); 
            } else if (bundle 
              .containsKey(AccountManager.KEY_AUTHTOKEN)) { 
             setAuthToken(bundle 
               .getString(AccountManager.KEY_AUTHTOKEN)); 
             // executeRefreshCalendars(); 
            } 
           } catch (Exception e) { 
            handleException(e); 
           } 
          } 
         }, null); 
      } else { 
       // executeRefreshCalendars(); 
      } 
      return; 
     } 
     chooseAccount(); 
    } 

private void chooseAccount() { 
    accountManager.manager.getAuthTokenByFeatures(
      GoogleAccountManager.ACCOUNT_TYPE, AUTH_TOKEN_TYPE, null, 
      ExportClockOption.this, null, null, 
      new AccountManagerCallback<Bundle>() { 

       @Override 
       public void run(AccountManagerFuture<Bundle> future) { 
        Bundle bundle; 
        try { 
         bundle = future.getResult(); 
         setAccountName(bundle 
           .getString(AccountManager.KEY_ACCOUNT_NAME)); 
         setAuthToken(bundle 
           .getString(AccountManager.KEY_AUTHTOKEN)); 
         // executeRefreshCalendars(); 
        } catch (OperationCanceledException e) { 
         // user canceled 
        } catch (AuthenticatorException e) { 
         handleException(e); 
        } catch (IOException e) { 
         handleException(e); 
        } 
       } 
      }, null); 
} 

void setAuthToken(String authToken) { 
    SharedPreferences.Editor editor = settings.edit(); 
    editor.putString(PREF_AUTH_TOKEN, authToken); 
    editor.commit(); 
    createCalendarService(authToken); 
    try { 
     Events events = service.events().list("primary").execute(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

private void createCalendarService(String authToken) { 
    accessProtectedResource = new GoogleAccessProtectedResource(authToken); 

    Log.i(TAG, "accessProtectedResource.getAccessToken() = " 
      + accessProtectedResource.getAccessToken()); 
    JacksonFactory jsonFactory = new JacksonFactory(); 
    service = com.google.api.services.calendar.Calendar 
      .builder(transport, jsonFactory) 
      .setApplicationName("Time Journal") 
      .setJsonHttpRequestInitializer(
        new JsonHttpRequestInitializer() { 
         @Override 
         public void initialize(JsonHttpRequest request) { 
          CalendarRequest calendarRequest = (CalendarRequest) request; 
          calendarRequest 
            .setKey("<YOUR SIMPLE API KEY>"); 
         } 
        }).setHttpRequestInitializer(accessProtectedResource) 
      .build(); 
} 
संबंधित मुद्दे