27

Ich versuche, die YouTubeData API mit OAuth 2.0-Authentifizierung auf Android zu verwenden, und ich bin ein bisschen mit ihm zu kämpfen.Youtube Data API mit OAuth2.0 auf Android

ich gesucht habe viel online, aber es gibt nicht viel Hilfe für die Android-Implementierung.

Zunächst einmal ist es mir nicht klar, was der beste Weg, um ein OAuth-Token zu erhalten. Im Dokument schlagen sie vor, dass es für Android besser ist, sie über die Google Play-Dienstelib zu erhalten. Ist das wahr? Wenn ja, sollte es nach dieser Anleitung ziemlich trivial sein: https://developers.google.com/android/guides/http-auth. Aber an diesem Punkt werde ich das Token in einem String Objekt haben .. Wie sollte ich es mit der YouTubeData API verwenden? Soll ich es irgendwo in der YouTube.Builder platzieren?

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

Wenn ja, weiß jemand wo?

auf Stackoverflow Suche Ich habe über diese Frage kommen: What to do after getting Auth Token - Android Youtube API. Hier sagt Ibrahim Ulukaya, dass es besser ist, GoogleAccountCredential zu verwenden. Für das, was ich verstanden habe (Access to Google API - GoogleAccountCredential.usingOAuth2 vs GoogleAuthUtil.getToken()) sollte die Android-Version von GoogleAccountCredential die GoogleAuthUtil von der Google Play-Dienste lib verwendet, so könnte es sehr nützlich sein, den Prozess zu vereinfachen. Ich habe mir das Beispielprojekt von Ibrahim Ulukaya angesehen (https://github.com/youtube/yt-direct-lite-android) und ich habe alles so implementiert wie er. Aber es scheint nicht sehr gut zu funktionieren, da ich diese Nachricht nur im Logcat erhalte: "Es gab einen IO-Fehler: com.google.android.gms.auth.UserRecoverableAuthException: NeedPermission: null".
(Ich habe alle erforderlichen APIs in Google Console aktiviert und die Client-ID für meine App erstellt)

An diesem Punkt bin ich irgendwie verloren.
Soll ich direkt die GoogleAuthUtil aus der Google Play-Dienste lib verwenden? in diesem Fall einmal das Token als String erhalten, wie kann ich es mit den YouTubeData APIs verwenden?
Oder sollte ich die GoogleAccountCredential verwenden? in diesem Fall weiß jemand, wie ich den Fehler "NeedPersmission: null" lösen kann?

---- EDIT:

Details auf, was mein App zu tun versucht: mit dieser Art von APIs dies meine ersten Erfahrung sein ich von den einfachen Sachen gestartet: Videoinformationen abrufen und dann Spielen Sie diese Videos ohne Benutzerauthentifizierung ab. Ich habe das ziemlich einfach geschafft, aber für den Zweck meiner App muss ich auf die Benutzerdaten zugreifen, insbesondere müssen Benutzer in der Lage sein, Videos zu mögen und zu kommentieren. Also begann ich mit der Implementierung von OAuth2 und versuchte genau die gleichen Abfragen wie zuvor (Videoinformationen abzurufen).

Antwort

6

Wow. Die Dokumentation dazu ist sehr verwirrend. Volle Offenlegung, ich bin kein Android-Entwickler, aber ich bin ein Java-Entwickler, der mit Google Apps und OAuth2 gearbeitet hat.

Google Play oder nicht Google Play?Zunächst einmal sind die Google Play-Dienste nur auf Android-Geräten mit installierten Google Play-Diensten verfügbar (also nicht auf OUYA, Amazon-Geräten usw.). Google state, dass „die Google die bestmögliche Leistung und Erfahrung Play-Bibliothek Sie geben.“.

Es gibt zahlreiche Diskussionen (z. B. here, here) von tatsächlichen Android-Entwicklern, die die verschiedenen Vorzüge von Google Play gegenüber anderen Techniken auflisten. Ich würde mir vorstellen, dass sobald Sie in der Lage sind, Ihre Anwendung mit einer Methode arbeiten zu lassen, dann sollte es leicht genug sein, sich zu ändern, wenn Sie dies wünschen.

Ein großer Teil des Beispielcodes verwendet den Android AccountManager (Aufgaben und Kalender sind Lieblingsbeispiele), so dass ich das zeigen werde.

Ihr Beispielcode sieht aus, als wäre es für eine einfache Suche, würde ich vermuten, dass viele der YouTube-API-Interaktionen OAuth2 nicht benötigen, in anderem Code habe ich diese leere HttpRequestInitializer-Implementierung als ein No-Op gesehen Funktion. (z.B. GeolocationSearch.java).

Es klingt, als ob Sie auf YouTube-API-Vorgänge zugreifen möchten, für die Kontoanmeldeinformationen erforderlich sind. Sie können etwas Ähnliches wie in diesem Android-Kalenderbeispiel (CalendarSampleActivity.java) tun, außer mit YouTube, wie in der Beispielantwort von 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(); 

Ich hoffe, das hilft.

+0

Hallo, genau das ist das Beispiel von Ibrahim Ulukaya (https://github.com/youtube/yt-direct-lite-android). Es sieht in der Tat die beste Lösung aus. Das Problem ist, dass ich diesen Fehler erhalte: "Es gab einen IO-Fehler: com.google.android.gms.auth.UserRecoverableAuthException: NeedPermission: null" im Logcat, und offensichtlich funktioniert die API nicht. Irgendeine Idee, wie man es löst? –

+0

http://stackoverflow.com/questions/14383965/userrecoverableauthexception-needpermission Ich bin sicher, Sie wissen das, aber Ihre Anwendung verschiedene Berechtigungen, um die Gerätefunktionen (zum Beispiel Internet!) Für den Zugriff auf und den Zugang YouTube auf den Benutzer Namen. Welche Berechtigungen Sie benötigen, hängt vom ausgewählten Authentifizierungsmechanismus ab. Sehen Sie sich die verlinkten Android-Diskussionen an, in denen es um GET_ACCOUNTS und USE_CREDENTIALS geht. Wie sieht dein Manifest aus? (Es kann sich lohnen, dies als separate Frage zu stellen) –

+0

Siehe Manifest eghttps: //github.com/youtube/yt-direct-lite-android/blob/master/app/src/main/AndroidManifest.xml Sie müssen auch um Ihre Entwickler-API-Anmeldeinformationen, z - http://stackoverflow.com/questions/29656454/declare-google-api-key-in-manifest-for-youtube-api. Es kann hilfreich sein, genau zu wissen, was Ihre Anwendung zu tun versucht. –

2

In der Methode initialize des HttpRequestInitializer Sie Header der Anforderung einstellen. Laut Googles-Dokumentation für Oath2 für Geräte https://developers.google.com/identity/protocols/OAuth2ForDevices, wenn Sie ein Zugriffs-Token haben, sollten Sie es in den Authorization: Bearer HTTP-Header setzen.

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

Denken Sie daran, den Raum nach dem Träger in dem Autorisierungsheader Wert

+0

ich über diese Option nicht gedacht hat. Denkst du, dass ich in diesem Fall mit dem Refresh-Prozess umgehen muss? –

+0

Ja, wenn Sie das Token als String erhalten und es manuell an Anfragen anhängen, müssen Sie den Aktualisierungsvorgang selbst durchführen. – Malthan