| page.title=Creating a Stub Authenticator | |
| trainingnavtop=true | |
| @jd:body | |
| <div id="tb-wrapper"> | |
| <div id="tb"> | |
| <h2>This lesson teaches you to</h2> | |
| <ol> | |
| <li> | |
| <a href="#CreateAuthenticator">Add a Stub Authenticator Component</a> | |
| </li> | |
| <li> | |
| <a href="#CreateAuthenticatorService">Bind the Authenticator to the Framework</a> | |
| </li> | |
| <li> | |
| <a href="#CreateAuthenticatorFile">Add the Authenticator Metadata File</a> | |
| </li> | |
| <li> | |
| <a href="#DeclareAuthenticator">Declare the Authenticator in the Manifest</a> | |
| </li> | |
| </ol> | |
| <h2>You should also read</h2> | |
| <ul> | |
| <li> | |
| <a href="{@docRoot}guide/components/bound-services.html">Bound Services</a> | |
| </li> | |
| </ul> | |
| <h2>Try it out</h2> | |
| <div class="download-box"> | |
| <a href="http://developer.android.com/shareables/training/BasicSyncAdapter.zip" class="button">Download the sample</a> | |
| <p class="filename">BasicSyncAdapter.zip</p> | |
| </div> | |
| </div> | |
| </div> | |
| <p> | |
| The sync adapter framework assumes that your sync adapter transfers data between device storage | |
| associated with an account and server storage that requires login access. For this reason, the | |
| framework expects you to provide a component called an authenticator as part of your sync | |
| adapter. This component plugs into the Android accounts and authentication framework and | |
| provides a standard interface for handling user credentials such as login information. | |
| </p> | |
| <p> | |
| Even if your app doesn't use accounts, you still need to provide an authenticator component. | |
| If you don't use accounts or server login, the information handled by the authenticator is | |
| ignored, so you can provide an authenticator component that contains stub method | |
| implementations. You also need to provide a bound {@link android.app.Service} that | |
| allows the sync adapter framework to call the authenticator's methods. | |
| </p> | |
| <p> | |
| This lesson shows you how to define all the parts of a stub authenticator that you need to | |
| satisfy the requirements of the sync adapter framework. If you need to provide a real | |
| authenticator that handles user accounts, read the reference documentation for | |
| {@link android.accounts.AbstractAccountAuthenticator}. | |
| </p> | |
| <h2 id="CreateAuthenticator">Add a Stub Authenticator Component</h2> | |
| <p> | |
| To add a stub authenticator component to your app, create a class that extends | |
| {@link android.accounts.AbstractAccountAuthenticator}, and then stub out the required methods, | |
| either by returning {@code null} or by throwing an exception. | |
| </p> | |
| <p> | |
| The following snippet shows an example of a stub authenticator class: | |
| </p> | |
| <pre> | |
| /* | |
| * Implement AbstractAccountAuthenticator and stub out all | |
| * of its methods | |
| */ | |
| public class Authenticator extends AbstractAccountAuthenticator { | |
| // Simple constructor | |
| public Authenticator(Context context) { | |
| super(context); | |
| } | |
| // Editing properties is not supported | |
| @Override | |
| public Bundle editProperties( | |
| AccountAuthenticatorResponse r, String s) { | |
| throw new UnsupportedOperationException(); | |
| } | |
| // Don't add additional accounts | |
| @Override | |
| public Bundle addAccount( | |
| AccountAuthenticatorResponse r, | |
| String s, | |
| String s2, | |
| String[] strings, | |
| Bundle bundle) throws NetworkErrorException { | |
| return null; | |
| } | |
| // Ignore attempts to confirm credentials | |
| @Override | |
| public Bundle confirmCredentials( | |
| AccountAuthenticatorResponse r, | |
| Account account, | |
| Bundle bundle) throws NetworkErrorException { | |
| return null; | |
| } | |
| // Getting an authentication token is not supported | |
| @Override | |
| public Bundle getAuthToken( | |
| AccountAuthenticatorResponse r, | |
| Account account, | |
| String s, | |
| Bundle bundle) throws NetworkErrorException { | |
| throw new UnsupportedOperationException(); | |
| } | |
| // Getting a label for the auth token is not supported | |
| @Override | |
| public String getAuthTokenLabel(String s) { | |
| throw new UnsupportedOperationException(); | |
| } | |
| // Updating user credentials is not supported | |
| @Override | |
| public Bundle updateCredentials( | |
| AccountAuthenticatorResponse r, | |
| Account account, | |
| String s, Bundle bundle) throws NetworkErrorException { | |
| throw new UnsupportedOperationException(); | |
| } | |
| // Checking features for the account is not supported | |
| @Override | |
| public Bundle hasFeatures( | |
| AccountAuthenticatorResponse r, | |
| Account account, String[] strings) throws NetworkErrorException { | |
| throw new UnsupportedOperationException(); | |
| } | |
| } | |
| </pre> | |
| <h2 id="CreateAuthenticatorService">Bind the Authenticator to the Framework</h2> | |
| <p> | |
| In order for the sync adapter framework to access your authenticator, you must create a bound | |
| Service for it. This service provides an Android binder object that allows the framework | |
| to call your authenticator and pass data between the authenticator and the framework. | |
| </p> | |
| <p> | |
| Since the framework starts this {@link android.app.Service} the first time it needs to | |
| access the authenticator, you can also use the service to instantiate the authenticator, | |
| by calling the authenticator constructor in the | |
| {@link android.app.Service#onCreate Service.onCreate()} method of the service. | |
| </p> | |
| <p> | |
| The following snippet shows you how to define the bound {@link android.app.Service}: | |
| </p> | |
| <pre> | |
| /** | |
| * A bound Service that instantiates the authenticator | |
| * when started. | |
| */ | |
| public class AuthenticatorService extends Service { | |
| ... | |
| // Instance field that stores the authenticator object | |
| private Authenticator mAuthenticator; | |
| @Override | |
| public void onCreate() { | |
| // Create a new authenticator object | |
| mAuthenticator = new Authenticator(this); | |
| } | |
| /* | |
| * When the system binds to this Service to make the RPC call | |
| * return the authenticator's IBinder. | |
| */ | |
| @Override | |
| public IBinder onBind(Intent intent) { | |
| return mAuthenticator.getIBinder(); | |
| } | |
| } | |
| </pre> | |
| <h2 id="CreateAuthenticatorFile">Add the Authenticator Metadata File</h2> | |
| <p> | |
| To plug your authenticator component into the sync adapter and account frameworks, you need to | |
| provide these framework with metadata that describes the component. This metadata declares the | |
| account type you've created for your sync adapter and declares user interface elements | |
| that the system displays if you want to make your account type visible to the user. Declare this | |
| metadata in a XML file stored in the {@code /res/xml/} directory in your app project. | |
| You can give any name to the file, although it's usually called {@code authenticator.xml}. | |
| </p> | |
| <p> | |
| This XML file contains a single element <code><account-authenticator></code> that | |
| has the following attributes: | |
| </p> | |
| <dl> | |
| <dt> | |
| <code>android:accountType</code> | |
| </dt> | |
| <dd> | |
| The sync adapter framework requires each sync adapter to have an account type, in the form | |
| of a domain name. The framework uses the account type as part of the sync adapter's | |
| internal identification. For servers that require login, the account type along with a | |
| user account is sent to the server as part of the login credentials. | |
| <p> | |
| If your server doesn't require login, you still have to provide an account type. For the | |
| value, use a domain name that you control. While the framework uses it to manage your | |
| sync adapter, the value is not sent to your server. | |
| </p> | |
| </dd> | |
| <dt> | |
| <code>android:icon</code> | |
| </dt> | |
| <dd> | |
| Pointer to a <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable</a> | |
| resource containing an icon. If you make the sync adapter visible by specifying the | |
| attribute <code>android:userVisible="true"</code> in <code>res/xml/syncadapter.xml</code>, | |
| then you must provide this icon resource. It appears in the <b>Accounts</b> section of | |
| the system's Settings app. | |
| </dd> | |
| <dt> | |
| <code>android:smallIcon</code> | |
| </dt> | |
| <dd> | |
| Pointer to a <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable</a> | |
| resource containing a small version of the icon. This resource may be used instead of | |
| <code>android:icon</code> in the <b>Accounts</b> section of the system's Settings app, | |
| depending on the screen size. | |
| </dd> | |
| <dt> | |
| <code>android:label</code> | |
| </dt> | |
| <dd> | |
| Localizable string that identifies the account type to users. If you make the sync adapter | |
| visible by specifying the attribute <code>android:userVisible="true"</code> in | |
| <code>res/xml/syncadapter.xml</code>, then you should provide this string. It appears in the | |
| <b>Accounts</b> section of the system's Settings app, next to the icon you define for the | |
| authenticator. | |
| </dd> | |
| </dl> | |
| <p> | |
| The following snippet shows the XML file for the authenticator you created previously: | |
| </p> | |
| <pre> | |
| <?xml version="1.0" encoding="utf-8"?> | |
| <account-authenticator | |
| xmlns:android="http://schemas.android.com/apk/res/android" | |
| android:accountType="example.com" | |
| android:icon="@drawable/ic_launcher" | |
| android:smallIcon="@drawable/ic_launcher" | |
| android:label="@string/app_name"/> | |
| </pre> | |
| <h2 id="DeclareAuthenticator">Declare the Authenticator in the Manifest</h2> | |
| <p> | |
| In a previous step, you created a bound {@link android.app.Service} that links the authenticator | |
| to the sync adapter framework. To identify this service to the system, declare it in your app | |
| manifest by adding the following | |
| <code><a href="{@docRoot}guide/topics/manifest/service-element.html"><service></a></code> | |
| element as a child element of | |
| <code><a href="{@docRoot}guide/topics/manifest/application-element.html"><application></a></code>: | |
| </p> | |
| <pre> | |
| <service | |
| android:name="com.example.android.syncadapter.AuthenticatorService"> | |
| <intent-filter> | |
| <action android:name="android.accounts.AccountAuthenticator"/> | |
| </intent-filter> | |
| <meta-data | |
| android:name="android.accounts.AccountAuthenticator" | |
| android:resource="@xml/authenticator" /> | |
| </service> | |
| </pre> | |
| <p> | |
| The | |
| <code><a href="{@docRoot}guide/topics/manifest/intent-filter-element.html"><intent-filter></a></code> | |
| element sets up a filter that's triggered by the intent action | |
| {@code android.accounts.AccountAuthenticator}, which sent by the system to run the | |
| authenticator. When the filter is triggered, the system starts {@code AuthenticatorService}, | |
| the bound {@link android.app.Service} you have provided to wrap the authenticator. | |
| </p> | |
| <p> | |
| The | |
| <code><a href="{@docRoot}guide/topics/manifest/meta-data-element.html"><meta-data></a></code> | |
| element declares the metadata for the authenticator. The | |
| <code><a href="{@docRoot}guide/topics/manifest/meta-data-element.html#nm">android:name</a></code> | |
| attribute links the meta-data to the authentication framework. The | |
| <code><a href="{@docRoot}guide/topics/manifest/meta-data-element.html#rsrc">android:resource</a></code> | |
| element specifies the name of the authenticator metadata file you created previously. | |
| </p> | |
| <p> | |
| Besides an authenticator, a sync adapter also requires a content provider. If your app doesn't | |
| use a content provider already, go to the next lesson to learn how to create a stub content | |
| provider; otherwise, go to the lesson <a href="creating-sync-adapter.html" | |
| >Creating a Sync Adapter</a>. | |
| </p> |