124697
124697

Reputation: 21893

Access Youtube API

I want to use Youtube API to get the subscription list of a user. It requires oauth.

I read that implementing google sign in will make it easier to access this API

I followed Google's documentation and now I got the signing in working

I have these files now.

My question:

1) Which sample do I need to use, IdTokenActivity.java or RestApiActivity.java

2) How can I use the sample code to access Youtube API? It doesn't say and the documentation is confusing

Upvotes: 1

Views: 404

Answers (1)

Bertrand Martel
Bertrand Martel

Reputation: 45432

  • Which sample do I need to use, IdTokenActivity.java or RestApiActivity.java ?

IdTokenActivity.java aims at retrieving an id_token. The id_token is a JWT token designed to be sent to a backend to authenticate the user as a real (trusted) Google user. You can find more information about the flow for the backend here.

RestApiActivity.java is used to consume Google API which is what you are trying to do.

  • How can I use the sample code to access Youtube API?

Here are the steps :

  1. Go to Google Signin setup for Android, download google-services.json and place it in your app folder

  2. in google developer console enable Youtube Data API

  3. add the following to app build.gradle :

    compile 'com.google.android.gms:play-services-auth:10.0.1'
    compile 'com.google.api-client:google-api-client-android:1.22.0' exclude module: 'httpclient'
    compile 'com.google.apis:google-api-services-youtube:v3-rev182-1.22.0'
    

with apply plugin: 'com.google.gms.google-services' to the bottom of your file

  1. update the following to your top level build.gradle :

    dependencies {
        classpath 'com.google.gms:google-services:3.0.0'
    }
    
  2. Include the RestApiActivity.java in your project and update the following :

    // Scope for reading user's contacts
    private static final String YOUTUBE_SCOPE = "https://www.googleapis.com/auth/youtube";
    
    ...
    
    // Configure sign-in to request the user's ID, email address, basic profile,
    // and readonly access to contacts.
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestScopes(new Scope(YOUTUBE_SCOPE))
            .requestEmail()
            .build();
    

and when the client is authenticated (in handleSignInResult) , request the subscription list as following :

/**
 * AsyncTask that uses the credentials from Google Sign In to access Youtube subscription API.
 */
private class GetSubscriptionTask extends AsyncTask<Account, Void, List<Subscription>> {

    @Override
    protected void onPreExecute() {
        showProgressDialog();
    }

    @Override
    protected List<Subscription> doInBackground(Account... params) {
        try {
            GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(
                    RestApiActivity.this,
                    Collections.singleton(YOUTUBE_SCOPE));
            credential.setSelectedAccount(params[0]);

            YouTube youtube = new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
                    .setApplicationName("Google Sign In Quickstart")
                    .build();

            SubscriptionListResponse connectionsResponse = youtube
                    .subscriptions()
                    .list("snippet")
                    .setChannelId("UCfyuWgCPu5WneQwuLBWd7Pg")
                    .execute();

            return connectionsResponse.getItems();
        } catch (UserRecoverableAuthIOException userRecoverableException) {
            Log.w(TAG, "getSubscription:recoverable exception", userRecoverableException);
            startActivityForResult(userRecoverableException.getIntent(), RC_RECOVERABLE);
        } catch (IOException e) {
            Log.w(TAG, "getSubscription:exception", e);
        }

        return null;
    }

    @Override
    protected void onPostExecute(List<Subscription> subscriptions) {
        hideProgressDialog();

        if (subscriptions != null) {
            Log.d(TAG, "subscriptions : size=" + subscriptions.size());

            // Get names of all connections
            for (int i = 0; i < subscriptions.size(); i++) {
                Log.v(TAG, "subscription : " + subscriptions.get(i).getId());
            }
        } else {
            Log.d(TAG, "subscriptions: null");
            mDetailTextView.setText("None");
        }
    }
}

which is launched in lieu of GetContacts with :

new GetSubscriptionTask().execute(mAccount);

You can find a complete example here

Upvotes: 2

Related Questions