Question

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>
Was it helpful?

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);
  }

OTHER TIPS

In your 'EventListActivity' onCreate, check to see if there are any accounts. If there aren't, open the Authenticator activity. If you want to make it do the check and show Authenticator, before EventListActivity's UI shows, all you have to do is add the code before 'setContentView' in the onCreate method.

Check if account exists,if not go to login screen.

public static boolean accountExists(Context ctx, AccountManager accountManager) {
Account[] accounts = accountManager.getAccountsByType(
  ctx.getString(R.string.account_type)
);
return accounts.length > 0;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top