27

我試圖在Android上使用YouTubeData API與OAuth 2.0身份驗證,我很苦惱它。YouTube上的數據API與Android上的OAuth2.0

我在網上搜索了很多,但對於Android的實現沒有太大的幫助。

首先,我不清楚什麼是獲得OAuth令牌的最佳方式。在文檔中,他們建議Android對於使用Google Play服務庫獲得更好。真的嗎?如果是的話,按照本指南,這應該是非常微不足道的:https://developers.google.com/android/guides/http-auth。 但是在這一點上,我將在String對象中擁有令牌。我應該如何將它與YouTubeData API一起使用?我應該把它放在YouTube.Builder的某處嗎?

YouTube youtube = new YouTube.Builder(Auth.HTTP_TRANSPORT, Auth.JSON_FACTORY, new HttpRequestInitializer() { 
     public void initialize(HttpRequest request) throws IOException { 
     } 
    }).setApplicationName("AppName").build(); 

如果是的話,有誰知道在哪裏?

在StackOverflow上搜索我遇到過這個問題:What to do after getting Auth Token - Android Youtube API。這裏Ibrahim Ulukaya說使用GoogleAccountCredential更好。對於我所瞭解的(Access to Google API - GoogleAccountCredential.usingOAuth2 vs GoogleAuthUtil.getToken()),Android版本GoogleAccountCredential應該使用Google Play服務庫中提供的GoogleAuthUtil,所以它可能對簡化流程非常有用。我已經看過來自Ibrahim Ulukaya建議的示例項目(https://github.com/youtube/yt-direct-lite-android),並且我已經實施了一切,就像他一樣。但它似乎沒有工作得很好,因爲我只是在logcat中獲得這條消息:「出現IO錯誤:com.google.android.gms.auth.UserRecoverableAuthException:NeedPermission:null」。
(請注意,我已經在Google控制檯中啓用了所有必需的API,併爲我的應用程序創建了客戶端ID)

此時我有點迷路。
我應該直接使用Google Play服務庫中的GoogleAuthUtil嗎?在這種情況下,一旦獲得令牌爲String我如何將它與YouTubeData API一起使用?
還是應該使用GoogleAccountCredential?在這種情況下,有人知道我該如何解決「NeedPersmission:null」錯誤?

----編輯:是這個我用這種原料藥我從簡單的東西開始第一次體驗:獲取視頻信息,然後什麼我的應用程序正在試圖做

細節播放這些視頻,無需任何用戶身份驗證。我設法做到這一點很容易,但爲了我的應用程序的目的,我需要訪問用戶數據,特別是用戶必須能夠喜歡和評論視頻。 所以我開始實施OAuth2,試圖做我以前做的相同的確切查詢(檢索視頻信息)。

回答

6

哇承載後的空間。關於這個文件是超級混亂。充分披露,我不是Android開發人員,但我是一位與Google應用程序和OAuth2合作的Java開發人員。

Google Play或不是Google Play?首先,Google Play服務僅適用於安裝了Google Play服務的Android設備(不適用OUYA,亞馬遜設備等)。 Google state表示「Google Play圖書館將爲您提供最佳的性能和體驗。」「。

來自實際Android開發者的衆多討論(例如here,here)列出了Google Play經文其他技術的各種優點。我會想象一旦你能夠使用一種方法讓你的應用程序工作,那麼如果你願意,它應該是一個很容易改變的。

大部分關於使用Android AccountManager的示例代碼(任務和日曆都是最喜歡的示例),這就是我將要展示的內容。

您的示例代碼看起來像可能用於簡單搜索,我猜想許多YouTube API交互不需要OAuth2,在其他代碼中我已經看到這個空的HttpRequestInitializer實現被稱爲無操作功能。 (例如GeolocationSearch.java)。

這聽起來像您想要訪問需要帳戶憑據的YouTube API操作。除YouTube之外,您可以執行與此Android日曆示例類似的操作(CalendarSampleActivity.java),如here的示例回答。

// Google Accounts 
credential = GoogleAccountCredential.usingOAuth2(this, YouTubeScopes.YOUTUBE, YouTubeScopes.YOUTUBE_READONLY); 
SharedPreferences settings = getPreferences(Context.MODE_PRIVATE); 
credential.setSelectedAccountName(settings.getString(PREF_ACCOUNT_NAME, null)); 
// YouTube client 
service = 
     new com.google.api.services.youtube.YouTube.Builder(transport, jsonFactory, credential) 
      .setApplicationName("Google-YouTubeAndroidSample/1.0").build(); 

我希望這有助於。

+0

嗨,這正是易卜拉欣Ulukaya(https://github.com/youtube/yt-direct-lite-android)的例子。它確實是最好的解決方案。問題是我收到這個錯誤:logcat中出現「IO錯誤:com.google.android.gms.auth.UserRecoverableAuthException:NeedPermission:null」,顯然這個API不起作用。 關於如何解決它的任何想法? –

+0

http://stackoverflow.com/questions/14383965/userrecoverableauthexception-needpermission我相信你知道這一點,但你的應用程序需要各種權限才能訪問設備功能(例如Internet!)並以用戶的名義訪問YouTube。確切地說,您需要的權限取決於您選擇的身份驗證機制。請參閱關於GET_ACCOUNTS和USE_CREDENTIALS的鏈接Android討論。你的清單是什麼樣的? (這可能值得作爲一個單獨的問題提出) –

+0

請參閱manifest eghttps://github.com/youtube/yt-direct-lite-android/blob/master/app/src/main/AndroidManifest.xml您還需要包括您的開發者API憑證,例如 - http://stackoverflow.com/questions/29656454/declare-google-api-key-in-manifest-for-youtube-api。確切知道你的應用程序試圖做什麼可能會有所幫助。 –

2

在HttpRequestInitializer的初始化方法中,您可以設置請求的標頭。根據Oog2的設備https://developers.google.com/identity/protocols/OAuth2ForDevices的Googles文檔記錄,如果您有訪問令牌,則應將其放入Authorization:Bearer HTTP標頭中。

YouTube youtube = new YouTube.Builder(Auth.HTTP_TRANSPORT, Auth.JSON_FACTORY, new HttpRequestInitializer() { 
    public void initialize(HttpRequest request) throws IOException { 
     request.put("Authorization", "Bearer " + yourAccessTokenString); 
    } 
}).setApplicationName("AppName").build(); 

記住在授權報頭值

+0

我沒有想過這個選項。你認爲在這種情況下,我將不得不處理刷新過程? –

+0

是的,如果您將令牌作爲字符串獲取並手動將其附加到請求中,則需要自行處理刷新過程。 – Malthan