27

Sto provando a utilizzare l'API YouTubeData con l'autenticazione OAuth 2.0 su Android, e sono un po 'in difficoltà con esso.YouTube Data API con OAuth2.0 su Android

Ho cercato molto online, ma non c'è molto aiuto per l'implementazione di Android.

Prima di tutto, non mi è chiaro quale sia il modo migliore per ottenere un token OAuth. Nel documento suggeriscono che per Android è meglio ottenerlo utilizzando la lib di servizi di Google Play. È vero? se sì, dovrebbe essere piuttosto banale seguendo questa guida: https://developers.google.com/android/guides/http-auth. Ma a questo punto avrò il token in un oggetto String .. come dovrei usarlo con l'API YouTubeData? Dovrei metterlo da qualche parte nello 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(); 

se sì, qualcuno sa dove?

Ricerca su StackOverflow mi sono imbattuto in questa domanda: What to do after getting Auth Token - Android Youtube API. Qui Ibrahim Ulukaya dice che è meglio usare GoogleAccountCredential. Per quello che ho capito (Access to Google API - GoogleAccountCredential.usingOAuth2 vs GoogleAuthUtil.getToken()) la versione Android di GoogleAccountCredential dovrebbe utilizzare lo GoogleAuthUtil fornito dalla lib dei servizi di Google Play, quindi potrebbe essere piuttosto utile per semplificare il processo. Ho esaminato il progetto di esempio suggerito da Ibrahim Ulukaya (https://github.com/youtube/yt-direct-lite-android) e ho implementato tutto come fa lui. Ma non sembra funzionare molto bene poiché sto ottenendo questo messaggio solo nel logcat: "C'era un errore IO: com.google.android.gms.auth.UserRecoverableAuthException: NeedPermission: null".
(Si noti che ho abilitato tutte le API necessarie sulla Google Console e ho creato l'ID cliente per la mia app)

A questo punto sono perso.
Devo utilizzare direttamente il GoogleAuthUtil dalla lib di Google Play services? in questo caso, una volta ottenuto il token come String, come posso usarlo con le API YouTubeData?
O dovrei usare lo GoogleAccountCredential? in questo caso qualcuno sa come posso risolvere l'errore "NeedPersmission: null"?

---- EDIT:

dettagli su ciò che la mia applicazione sta cercando di fare: essendo questa la mia prima esperienza con questo tipo di API ho iniziato dalla roba semplice: recuperare le informazioni video e poi riprodurre quei video, senza alcuna autenticazione dell'utente. Sono riuscito a farlo abbastanza facilmente, ma per lo scopo della mia app ho bisogno di accedere ai dati dell'utente, in particolare gli utenti devono essere in grado di apprezzare e commentare i video. Così ho iniziato a implementare OAuth2, cercando di fare le stesse query esatte che stavo facendo prima (recuperare informazioni video).

risposta

6

Wow. La documentazione su questo è super confusionaria. Piena divulgazione, non sono uno sviluppatore Android, ma sono uno sviluppatore Java che ha lavorato con Google Apps e OAuth2.

Google Play o non Google Play?Prima di tutto, i servizi di Google Play saranno disponibili solo sui dispositivi Android con i servizi di Google Play installati (quindi non su OUYA, dispositivi Amazon, ecc.). Google state che "la libreria di Google Play offrirà le migliori prestazioni ed esperienza possibili.".

Esistono numerose discussioni (ad esempio here, here) da veri sviluppatori Android che elencano i vari meriti di Google Play rispetto ad altre tecniche. Immagino che una volta in grado di far funzionare la tua applicazione usando un metodo, dovrebbe essere abbastanza facile da cambiare se lo desideri.

Gran parte del codice di esempio su utilizza l'account manager di Android (attività e calendari sono esempi preferiti), quindi è quello che mostrerò.

Il tuo codice di esempio sembra essere per una semplice ricerca, direi che molte delle interazioni dell'API di YouTube non richiedono OAuth2, in altri codici ho visto questa implementazione HttpRequestInitializer vuota chiamata no-op funzione. (ad esempio GeolocationSearch.java).

Sembra che si desideri accedere alle operazioni dell'API di YouTube che richiedono credenziali dell'account. Puoi fare qualcosa di simile a questo esempio di Android Calendar (CalendarSampleActivity.java) tranne con YouTube, come la risposta di esempio da 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(); 

Spero che questo aiuti.

+0

Ciao, questo è esattamente ciò che fa l'esempio di Ibrahim Ulukaya (https://github.com/youtube/yt-direct-lite-android). Sembra davvero la soluzione migliore. Il problema è che sto ricevendo questo errore: "C'era un errore IO: com.google.android.gms.auth.UserRecoverableAuthException: NeedPermission: null" nel logcat, e ovviamente l'API non funziona. Qualche idea su come risolverlo? –

+0

http://stackoverflow.com/questions/14383965/userrecoverableauthexception-needpermission Sono certo che lo sai, ma la tua applicazione necessita di varie autorizzazioni per accedere alle funzionalità del dispositivo (ad esempio Internet!) E accedere a YouTube per conto degli utenti. Esattamente quali permessi sono necessari variano a seconda del meccanismo di autenticazione che hai scelto. Vedi le discussioni Android collegate dove parla di GET_ACCOUNTS e USE_CREDENTIALS. Come appare il tuo manifest? (potrebbe valere la pena di chiederglielo come una domanda separata) –

+0

Vedi manifest eghttps: //github.com/youtube/yt-direct-lite-android/blob/master/app/src/main/AndroidManifest.xml Hai anche bisogno per includere le credenziali API sviluppatore, ad es - http://stackoverflow.com/questions/29656454/declare-google-api-key-in-manifest-for-youtube-api. Potrebbe essere utile sapere esattamente cosa stai cercando di fare. –

2

Nel metodo di inizializzazione di HttpRequestInitializer è possibile impostare le intestazioni della richiesta. Secondo la documentazione di Google per Oath2 per i dispositivi https://developers.google.com/identity/protocols/OAuth2ForDevices se si dispone di un token di accesso, è necessario inserirlo nell'intestazione HTTP Autorizzazione: 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(); 

Ricordate lo spazio dopo il portatore nell'autorizzazione valore di intestazione

+0

Non ho pensato a questa opzione. Pensi che in questo caso dovrò gestire me stesso il processo di aggiornamento? –

+0

Sì, se si ottiene il token come stringa e lo si allega manualmente alle richieste, è necessario gestire autonomamente il processo di aggiornamento. – Malthan