Android Authenticator запускает экран входа в систему, когда нет учетной записи

Я создал Authenticator, я создал SyncAdapter (оба могут быть выполнены вручную через настройки эмулятора).

Как заставить мое приложение запускать экран входа в систему (метод addAccount) при запуске приложения, если учетная запись не найдена?

Вот мой 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>

person Rabbott    schedule 12.06.2012    source источник


Ответы (3)


Не работает AccountManager? Что-то типа:

 AccountManager accountManager = AccountManager.get(this);
 Account[] accounts = accountManager.getAccountsByType("myCustomAccount");
 if (accounts.length == 0) {
    accountManager.addAccount("myCustomAccount", null, null, null, this,
                               null, null);
  }
person Nikolay Elenkov    schedule 12.06.2012
comment
В вашем приложении :) Вызовите его из onResume(), чтобы обработать случай, когда пользователь удаляет учетную запись, а затем возвращается в ваше приложение. - person Nikolay Elenkov; 12.06.2012
comment
Отлично - как упоминалось @zed-scio, как мне предотвратить отображение другого намерения до отображения экрана входа в систему.. на данный момент метод onResume включает только ваш код и 'super.onResume();' но намерение, которое установлено для показа по умолчанию, мигает - person Rabbott; 12.06.2012
comment
Возможно, вы захотите сделать его немного более удобным для пользователя: показать какой-то пользовательский интерфейс, сказав: «У вас нет учетной записи, вы хотите ее зарегистрировать?» Позвольте пользователю выбирать, не просто навязывайте ему это. - person Nikolay Elenkov; 12.06.2012
comment
но .. у них должна быть учетная запись .. как еще они будут получать данные из моего веб-сервиса? - person Rabbott; 12.06.2012
comment
давайте продолжим обсуждение в чате - person Rabbott; 12.06.2012

В вашем 'EventListActivity' onCreate проверьте, есть ли какие-либо учетные записи. Если их нет, откройте действие Authenticator. Если вы хотите, чтобы он выполнял проверку и показывал Authenticator до того, как отобразится пользовательский интерфейс EventListActivity, все, что вам нужно сделать, это добавить код перед setContentView в методе onCreate.

person Zaid Daghestani    schedule 12.06.2012
comment
Так это не то, что происходит, я должен сделать это вручную и запустить намерение? Я полагал, что Android подхватит это и запустит, если ничего не будет обнаружено. - person Rabbott; 12.06.2012
comment
Я подумал, что вы говорили, что создали свой собственный класс AccountManager. Если это не так. Используйте ниже - person Zaid Daghestani; 12.06.2012

Проверьте, существует ли учетная запись, если нет, перейдите на экран входа в систему.

public static boolean accountExists(Context ctx, AccountManager accountManager) {
Account[] accounts = accountManager.getAccountsByType(
  ctx.getString(R.string.account_type)
);
return accounts.length > 0;
}
person Rohit    schedule 05.02.2015