Youtube Data API z OAuth2. 0 na Androida

[9]}próbuję używać API YouTubeData z uwierzytelnianiem OAuth 2.0 na Androidzie i trochę się z tym zmagam.

Szukałem dużo w Internecie, ale nie ma wiele pomocy dla implementacji Androida.

Po pierwsze, nie jest dla mnie jasne, jaki jest najlepszy sposób, aby uzyskać token OAuth. W doc sugerują, że dla Androida lepiej jest uzyskać go za pomocą usługi Google Play lib. To prawda? jeśli tak, powinno to być dość trywialne po tym przewodniku: https://developers.google.com/android/guides/http-auth . Ale w tym momencie będę miał token w String obiekcie .. jak korzystać z interfejsu API YouTubeData? Czy powinienem umieścić go gdzieś w 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();
Jeśli tak, to czy ktoś wie gdzie?

Szukając w StackOverflow natknąłem się na pytanie: co zrobić po uzyskaniu Auth Tokena - Android Youtube API. Tutaj Ibrahim Ulukaya mówi, że lepiej używać GoogleAccountCredential. For what i ' ve understood (dostęp do Google API-GoogleAccountCredential.usingOAuth2 vs GoogleAuthUtil.getToken () ) wersja Androida GoogleAccountCredential powinna używać GoogleAuthUtil dostarczonej z biblioteki usług Google Play, więc uproszczenie tego procesu może być całkiem przydatne. Przyjrzałem się przykładowemu projektowi zaproponowanemu przez Ibrahima Ulukayę (https://github.com/youtube/yt-direct-lite-android ) i zaimplementowałem wszystko tak jak on. Ale to chyba nie działa zbyt dobrze, ponieważ otrzymuję tylko tę wiadomość w logcat: "wystąpił błąd IO: com.google.android.gms.auth.UserRecoverableAuthException: NeedPermission : null".
(Zauważ, że włączyłem wszystkie wymagane interfejsy API w konsoli Google i utworzyłem identyfikator klienta dla mojej aplikacji)

W tym momencie jestem trochę zagubiony.
Czy powinienem używać bezpośrednio GoogleAuthUtil z usługi Google Play lib? w tym przypadku po uzyskaniu tokena jako String Jak mogę go używać z interfejsami API YouTubeData?
Czy powinienem użyć GoogleAccountCredential ? w tym przypadku ktoś wie jak mogę rozwiązać błąd "NeedPersmission: null"?

---- EDIT:

Szczegóły na temat tego, co moja aplikacja próbuje zrobić: będąc to moje pierwsze doświadczenie z tego rodzaju API zacząłem od łatwych rzeczy: pobieranie informacji wideo, a następnie odtwarzanie tych filmów, bez uwierzytelniania użytkownika. Udało mi się to zrobić dość łatwo, ale do celów mojej aplikacji muszę uzyskać dostęp do danych użytkownika, w szczególności użytkownicy muszą być w stanie polubić i komentować filmy. Więc Ja zacząłem implementować OAuth2, próbując wykonać dokładnie te same zapytania, które robiłem wcześniej (pobierać informacje wideo).

Author: Community, 2015-06-27

2 answers

Wow. Dokumentacja na ten temat jest bardzo myląca. Pełne ujawnienie, nie jestem programistą Android, ale jestem programistą Java, który pracował z Google apps i OAuth2.

Google Play czy nie Google Play? Po pierwsze, usługi Google Play będą dostępne tylko na urządzeniach z Androidem z zainstalowanymi usługami Google Play (a więc nie na urządzeniach OUYA, Amazon itp.). Google stwierdza że " Biblioteka Google Play zapewni Ci najlepszą możliwą wydajność i doświadczenie.".

Istnieje wiele dyskusji (np. tutaj, tutaj) od rzeczywistych twórców Androida, które wymieniają różne zalety Google Play wersety innych technik. Wyobrażam sobie, że gdy już będziesz w stanie uruchomić swoją aplikację za pomocą jednej metody, to zmiana powinna być dość łatwa, jeśli sobie tego życzysz.

Większość przykładowego kodu o korzysta z Android AccountManager (zadania i kalendarze są ulubionymi przykładami), więc to jest to, co będę Pokaż.

Twój przykładowy kod wygląda tak, jakby mógł być do prostego wyszukiwania, domyślam się, że wiele interakcji API YouTube nie wymaga OAuth2, w innym kodzie widziałem tę pustą implementację HttpRequestInitializer określaną jako funkcja no-op. (np. Geolokacjearch.java).

Wygląda na to, że chcesz uzyskać dostęp do operacji API YouTube, które wymagają poświadczeń konta. Możesz zrobić coś podobnego do tego przykładu kalendarza na Androida (kalendarzejava ) z wyjątkiem YouTube, jak przykładowa odpowiedź z tutaj .

// 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();
Mam nadzieję, że to pomoże.
 6
Author: Mark McLaren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:32:02

W metodzie initialize HttpRequestInitializer można ustawić nagłówki żądania. Według Googles documentation for Oath2 for devices https://developers.google.com/identity/protocols/OAuth2ForDevices Jeśli masz token dostępu, powinieneś umieścić go w nagłówku HTTP Authorization: Bearer.

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();

Zapamiętaj spację po Bearerze w nagłówku autoryzacji

 2
Author: Malthan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-01 19:24:55