Search code examples
androidandroid-syncadapterandroid-authenticator

Android Authenticator Launch Login Screen When No Account Present


I've built an Authenticator, I've built a SyncAdapter (both can be manually executed through the settings on the emulator).

How do I get my application to launch the login screen (addAccount method) when the app launches, if no account is found?

Here is my Manifest.xml...

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.lateral.myapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="14"/>

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
    <uses-permission android:name="android.permission.USE_CREDENTIALS"/>    
    <uses-permission android:name="android.permission.READ_SYNC_STATS" />
    <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
    <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />

    <application android:icon="@drawable/icon" android:label="@string/app_name" android:name=".myappApplication">
        <activity android:name=".ui.EventListActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <service android:name=".authenticator.AccountAuthenticatorService" android:exported="true" android:process=":auth">
            <intent-filter>
                <action android:name="android.accounts.AccountAuthenticator"/>
            </intent-filter>
            <meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/authenticator"/>
        </service>

        <service android:name="sync.EventsSyncAdapterService" android:exported="true" android:process=":events">
            <intent-filter>
                <action android:name="android.content.SyncAdapter" />
            </intent-filter>
            <meta-data android:name="android.content.SyncAdapter" android:resource="@xml/sync_events" />
        </service>

        <activity android:excludeFromRecents="true" android:name=".authenticator.myappAuthenticatorActivity">
            <!--
                No intent-filter here! This activity is only ever launched by
                someone who explicitly knows the class name
            -->
        </activity>
    </application>

</manifest>

Solution

  • Doesn't going through the AccountManager work? Something like:

     AccountManager accountManager = AccountManager.get(this);
     Account[] accounts = accountManager.getAccountsByType("myCustomAccount");
     if (accounts.length == 0) {
        accountManager.addAccount("myCustomAccount", null, null, null, this,
                                   null, null);
      }