2012-06-12 12 views
5

He creado un Authenticator, he creado un SyncAdapter (ambos se pueden ejecutar manualmente a través de la configuración en el emulador).Android Authenticator Iniciar pantalla de inicio de sesión cuando no hay una cuenta presente

¿Cómo hago para que mi aplicación lance la pantalla de inicio de sesión (método AddCuenta) cuando se inicia la aplicación, si no se encuentra una cuenta?

Aquí está mi 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> 

Respuesta

4

no pasar por el AccountManager trabajo? Algo como:

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

que iría donde? – Rabbott

+0

En su aplicación :) Llámelo desde 'onResume()' para manejar el caso cuando el usuario elimine la cuenta y luego regrese a su aplicación. –

+0

Perfecto: como se menciona en @ zed-scio, ¿cómo evito que se muestre el otro intento antes de que se muestre la pantalla de inicio de sesión ... en este punto, el método onResume solo incluye su código y 'super.onResume();' pero la intención que está configurada para mostrarse como predeterminada parpadea – Rabbott

1

En su 'EventListActivity' onCreate, verifique si hay cuentas. Si no lo hay, abra la actividad Autenticador. Si desea que haga la verificación y muestre Authenticator, antes de que se muestre la IU de EventListActivity, todo lo que tiene que hacer es agregar el código antes de 'setContentView' en el método onCreate.

+0

Así que esto no es algo que sucede, lo he hecho manualmente y lanzar la intención? Pensé que Android tomaría esto y se lanzaría si no se detecta nada. – Rabbott

+0

Pensé que estabas diciendo que creaste tu propia clase de AccountManager. Si ese no es el caso. Use debajo –

0

Compruebe si existe una cuenta, si no vaya a la pantalla de inicio de sesión.

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