ayushgp
ayushgp

Reputation: 5101

Gmail API: Authentication using token retrieval

I have read this whole article for the authentication using OAuth2.0. But I didn't find a suitable method to do this on an android application. Please suggest a method to get the access token so that I can build a Gmail service object and access the inbox or any other method.

This is the example given by them in this link:

GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken);
Plus plus = new Plus.builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance(), credential)
    .setApplicationName("Google-PlusSample/1.0")
    .build();

Upvotes: 0

Views: 251

Answers (2)

tony
tony

Reputation: 216

This library might make it easier for you: https://github.com/Hafiz-Waleed-Hussain/EasySocial

Additionally you can check the source for the actual implementation.

Upvotes: 1

Psypher
Psypher

Reputation: 10829

Invoke the below method to get the token and the google account used in mobile. This method first retrieves the google account setup in your mobile and later retrieves the token. You can save the token and account name using preferences for later use so that you dont have to retrieve the token each time.

private void chooseAccount() {
        Intent intent = AccountPicker.newChooseAccountIntent(null, null,
                new String[]{"com.google"}, false, null, null, null, null);
        startActivityForResult(intent, 9009);
    }

After the account is retrieved the below method is called,

public static final String MAIL_GOOGLE_COM = "https://mail.google.com";
public static final String GMAIL_COMPOSE = "https://www.googleapis.com/auth/gmail.compose";
public static final String GMAIL_MODIFY = "https://www.googleapis.com/auth/gmail.modify";
private static final String SCOPE = "oauth2:" + GMAIL_COMPOSE + " " + GMAIL_MODIFY + " " + MAIL_GOOGLE_COM;

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
            //accountname - google account in your mobile is retrieved
            //now use the google account to retrieve the token
            new GetToken(getActivity().getApplicationContext(), SCOPE, accountName).execute();
            showErrorDialog(exception);
            }
        } else if (requestCode == Activity.RESULT_CANCELED) {
            Toast.makeText(getActivity(), "Cancelled!!!", Toast.LENGTH_SHORT).show();
        }
    }

Below class is used to get the token.

private class GetToken extends AsyncTask<Void, Void, Void> {
    Context context;
    String mScope, mEmail, token;

    GetToken(Context context, String scope, String email) {
        this.context = context;
        this.mScope = scope;
        this.mEmail = email;
    }

    @Override
    protected Void doInBackground(Void... params) {
        try {
            token = GoogleAuthUtil.getToken(context, mEmail, mScope);
            //save the token using preference for later use or do any good stuff using token here
            Log.v("ranjapp", "Token is " + token);
        } catch (UserRecoverableAuthException e) {
            handleException(e);
        } catch (GoogleAuthException ex) {
            handleException(ex);
        } catch (Exception e) {
            //display a error dialog
        }
        return null;
    }

    void handleException(final Exception e) {
        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (e instanceof UserRecoverableAuthException) {
                    Intent intent = ((UserRecoverableAuthException) e).getIntent();
                    startActivityForResult(intent, 10098);
                } else if (e instanceof GooglePlayServicesAvailabilityException) {
                    int statusCode = ((GooglePlayServicesAvailabilityException) e)
                            .getConnectionStatusCode();
                    Dialog dialog = GooglePlayServicesUtil.getErrorDialog(statusCode, getActivity(), 10099);
                    dialog.show();
                }
            }
        });
    }
}

You have to register your app in google play console to get the token successfully. Also ensure you have play services setup in your app.

To register your Android app with Google Cloud Console:

  1. Visit Google Cloud Console.
  2. If you have an existing project to which you're adding an Android app, select the project. Otherwise, click Create project at the top, enter your project name and ID, then click Create. Note: The name you provide for the project is the name that appears to users in the Google Settings app in the list of Connected apps.
  3. In the left-side navigation, select APIs & auth.
  4. Enable the API you'd like to use by setting the Status to ON.
  5. In the left-side navigation, select Credentials.
  6. Click Create new client ID or Create new key as appropriate for your app.
  7. Complete the form that appears by filling in your Android app details. To get the SHA1 fingerprint for your app, run the following command in a terminal: keytool -exportcert -alias <keystore_alias> -keystore <keystore_path> -list -v For example, you're using a debug-key with Eclipse, then the command looks like this: keytool -exportcert -alias androiddebugkey-keystore ~/.android/debug.keystore -list -v Then the keystore password is "android".
  8. Click Create.

For more information: https://developer.android.com/google/auth/http-auth.html

Upvotes: 2

Related Questions