page.title=Authorization
page.tags=AccountManager,oauth2
@jd:body

<div id="qv-wrapper">
  <div id="qv">    
    <h2>In this document</h2>
    <ol>
    <li><a href="#choose">Choosing an Account</a></li>
    <li><a href="#obtain">Obtaining an Access Token</a></li>
    <li><a href="#handle">Handling Exceptions</a></li>
    <li><a href="#use">Using the Access Token</a></li>
    </ol>
  </div>
</div>

<p>
    Google Play services offers a standard authorization flow for all Google APIs and
    all components of Google Play services. In addition, you can leverage the authorization
    portion of the Google Play services SDK to gain authorization to services that are not yet supported 
    in the Google Play services platform by using the access token to manually make API
    requests or using a client library provided by the service provider.
</p>

<p>For implementation details, see the sample in <code>&lt;android-sdk&gt;/extras/google-play-services/samples/auth</code>,
which shows you how to carry out these basic steps for obtaining an access token.</p>

<h2 id="choose">Choosing an Account</h2>
<p>
    Google Play services leverage existing accounts on an Android-powered device
    to gain authorization to the services that you want to use. To obtain an access token,
    a valid Google account is required and it must exist on the device. You can ask your users which
    account they want to use by enumerating the Google accounts on the device or using the
    built-in 
<a href="{@docRoot}reference/com/google/android/gms/common/AccountPicker.html">{@code
AccountPicker}</a>
    class to display a standard account picker view. You'll need the
    {@link android.Manifest.permission#GET_ACCOUNTS}
    permission set in your manifest file for both methods.
</p>
<p>
    For example, here's how to gather all of the Google accounts on a device and return them
    in an array. When obtaining an access token, only the email address of the account is 
    needed, so that is what the array stores:
</p>

<pre>
private String[] getAccountNames() {
    mAccountManager = AccountManager.get(this);
    Account[] accounts = mAccountManager.getAccountsByType(
            GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE);
    String[] names = new String[accounts.length];
    for (int i = 0; i &lt; names.length; i++) {
        names[i] = accounts[i].name;
    }
    return names;
}
</pre>
<h2 id="obtain">Obtaining an Access Token</h2>
<p>
  With an email address and the service scope you can now obtain an access token.
</p>
<p class="note"><strong>Note:</strong> Specify <code>"oauth2:<em>scope</em>"</code> for a single scope or
  <code>"oauth2:<em>scope1</em> <em>scope2</em> <em>scope3</em>"</code> for multiple scopes.</p>

There are two general
  ways to get a token:</p>

    <ul>
      <li>Call one of the two overloaded <a
      href="{@docRoot}reference/com/google/android/gms/auth/GoogleAuthUtil.html#getToken(android.content.Context, java.lang.String, java.lang.String)"
      >{@code GoogleAuthUtil.getToken()}</a> methods in a foreground activity where you can
        display a dialog to the user to interactively handle authorization errors.</li>
      <li>Call one of the three <a href="{@docRoot}reference/com/google/android/gms/auth/GoogleAuthUtil.html#getTokenWithNotification(android.content.Context, java.lang.String, java.lang.String, android.os.Bundle)"
      >{@code getTokenWithNotification()}</a>
        methods if you are trying to gain authorization in a background service or sync adapter so that a
        notification is displayed if an error occurs.</a></li>
    </ul>

    <h3>Using getToken()</h3>
    The following code snippet obtains an access token with an email address, the scope that you want to use for the service, and a {@link android.content.Context}:

<pre>
HelloActivity mActivity;
String mEmail;
String mScope;
String token;

...
try {
    token = GoogleAuthUtil.getToken(mActivity, mEmail, mScope);
} catch {
    ...
}
</pre>

<p>Call this method off of the main UI thread since it executes network transactions. An easy way to do this
  is in an {@link android.os.AsyncTask}.
  The sample in the Google Play services SDK shows you how to wrap this call in an AsyncTask.
  If authorization is successful, the token is returned. If not, the exceptions described in
<a href="#handle">Handling Exceptions</a>
  are thrown that you can catch and handle appropriately.
</p>

  <h3>Using getTokenWithNotification()</h3>
  <p>If you are obtaining access tokens in a background service or sync adapter, there
  are three overloaded
  <a href="{@docRoot}reference/com/google/android/gms/auth/GoogleAuthUtil.html#getTokenWithNotification(android.content.Context, java.lang.String, java.lang.String, android.os.Bundle)"
      >{@code getTokenWithNotification()}</a> methods
  that you can use:</p>
  <ul>
    <li><a href="{@docRoot}reference/com/google/android/gms/auth/GoogleAuthUtil.html#getTokenWithNotification(android.content.Context, java.lang.String, java.lang.String, android.os.Bundle)"
    >{@code getTokenWithNotification(Context context, String accountName, String scope, Bundle extras)}</a>:
    For background services. Displays a notification to the user when authorization errors occur.</li>
    <li><a href="{@docRoot}reference/com/google/android/gms/auth/GoogleAuthUtil.html#getTokenWithNotification(android.content.Context, java.lang.String, java.lang.String, android.os.Bundle, android.content.Intent)"
    >{@code getTokenWithNotification(Context context, String accountName, String scope, Bundle extras, Intent callback)}</a>:
    This method is for use in background services. It displays a notification to the user
    when authorization errors occur. If a user clicks the notification and then authorizes the
    app to access the account, the intent is broadcasted. When using this method:
    <ul>
     <li>Create a {@link android.content.BroadcastReceiver} that registers the intent and handles
it appropriately</li>
     <li>In the app's manifest file, set the <a
     href="{@docRoot}guide/topics/manifest/receiver-element.html#exported"><code>android:exported</code></a>
     attribute to <code>true</code> for the broadcast receiver</li>
     <li>Ensure that the intent is serializable using the {@link
android.content.Intent#toUri toUri(Intent.URI_INTENT_SCHEME)} and
    {@link android.content.Intent#parseUri parseUri(intentUri, Intent.URI_INTENT_SCHEME)} methods.</li>
   </ul>
    <li><a href="{@docRoot}reference/com/google/android/gms/auth/GoogleAuthUtil.html#getTokenWithNotification(android.content.Context, java.lang.String, java.lang.String, android.os.Bundle, java.lang.String, android.os.Bundle)"
    >{@code getTokenWithNotification(Context context, String accountName, String scope, Bundle extras, String authority, Bundle syncBundle)}</a>:
This method is for use in sync adapters. It displays a notification to the user when
errors occur. If a user clicks the notification and then authorizes the
app to access the account, the sync adapter retries syncing with the information
    contained in the <code>syncBundle</code> parameter.</li>
  </ul>
  
   <p>See the sample in <code>&lt;android-sdk&gt;/extras/google-play-services/samples/auth</code> for implementation details.</p>




<h2 id="handle">Handling Exceptions</h2>
<p>
    When requesting an access token with
    <a href="{@docRoot}reference/com/google/android/gms/auth/GoogleAuthUtil.html#getToken(android.content.Context, java.lang.String, java.lang.String)"
    >{@code GoogleAuthUtil.getToken()}</a>,
    the following exceptions can be thrown:
</p>
<ul>
    <li>
<a href="{@docRoot}reference/com/google/android/gms/auth/UserRecoverableAuthException.html"
>{@code UserRecoverableAuthException}</a>: 
        This exception is thrown when an error occurs that users can resolve, such as not yet granting access to their accounts or if they changed their password.
        This exception class contains a {@link android.app.Activity#getIntent getIntent()} 
        method that you can call to obtain an intent that you can use with
{@link android.app.Activity#startActivityForResult startActivityForResult()} 
        to obtain the user's resolution. You will need to handle the
{@link android.app.Activity#onActivityResult onActivityResult()} 
        callback when this activity returns to take action based on the user's actions.
  </li>
  <li>
<a href="{@docRoot}reference/com/google/android/gms/auth/GooglePlayServicesAvailabilityException.html"
>{@code GooglePlayServicesAvailabilityException}</a>: 
        This exception is a special case of <a href="{@docRoot}reference/com/google/android/gms/auth/UserRecoverableAuthException.html"
        >{@code UserRecoverableAuthException}</a>
        and occurs when the actual Google Play services APK is not installed or unavailable.
        This exception provides additional client support to
        handle and fix this issue by providing an error code that describes the exact cause of the problem.
        This exception also contains an intent that you can obtain and use to start
        an activity to resolve the issue.
    </li>
    <li>
<a href="{@docRoot}reference/com/google/android/gms/auth/GoogleAuthException.html">{@code
GoogleAuthException}</a>:
        This exception is thrown when the authorization fails, such as when an invalid scope is 
        specified or if the email address used for authorization is actually not on the user's 
        device.
    </li>
    <li>
<a href="{@docRoot}reference/com/google/android/gms/auth/UserRecoverableNotifiedException.html"
>{@code UserRecoverableNotifiedException}</a>:
        This exception is thrown when the authorization fails using one of the
<a href="{@docRoot}reference/com/google/android/gms/auth/GoogleAuthUtil.html#getTokenWithNotification(android.content.Context, java.lang.String, java.lang.String, android.os.Bundle)"
      >{@code getTokenWithNotification()}</a> methods and if the error
        is recoverable with a user action.
    </li>
</ul>
<p>
    For more information on how to handle these exceptions and code snippets, see the reference 
    documentation for the 
<a href="{@docRoot}reference/com/google/android/gms/auth/GoogleAuthUtil.html">{@code
GoogleAuthUtil}</a> class.
</p>




<h2 id="use">Using the Access Token</h2>
<p>
    Once you have successfully obtained a token, you can use it to access Google services.
    Many Google services provide client libraries, so it is recommended that you use these when 
    possible, but you can make raw HTTP requests as well with the token. The following example 
    shows you how to do this and handle HTTP error and success responses accordingly:
</p>

<pre>
URL url = new URL("https://www.googleapis.com/oauth2/v1/userinfo?access_token="
        + token);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
int serverCode = con.getResponseCode();
//successful query
if (serverCode == 200) {
    InputStream is = con.getInputStream();
    String name = getFirstName(readResponse(is));
    mActivity.show("Hello " + name + "!");
    is.close();
    return;
//bad token, invalidate and get a new one
} else if (serverCode == 401) {
    GoogleAuthUtil.invalidateToken(mActivity, token);
    onError("Server auth error, please try again.", null);
    Log.e(TAG, "Server auth error: " + readResponse(con.getErrorStream()));
    return;
//unknown error, do something else
} else {
    Log.e("Server returned the following error code: " + serverCode, null);
    return;
}
</pre>

<p>
    Notice that you must manually invalidate the token if the response from the server
    signifies an authorization error (401). This could mean the access token
    being used is invalid for the service's scope or the token may have expired. If this is the 
    case, obtain a new token using <a
href="{@docRoot}reference/com/google/android/gms/auth/GoogleAuthUtil.html#getToken(android.content.Context, java.lang.String, java.lang.String)"
>{@code GoogleAuthUtil.getToken()}</a>.
</p>
