2012-06-12 10 views
5

Ho creato un Authenticator, ho creato un SyncAdapter (entrambi possono essere eseguiti manualmente tramite le impostazioni sull'emulatore).Autenticatore Android Lanciare la schermata di accesso quando non è presente un account

Come si avvia la domanda per avviare la schermata di accesso (metodo addAccount) all'avvio dell'app, se non viene trovato alcun account?

Ecco il mio 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> 

risposta

4

non Vuol passare attraverso il lavoro AccountManager? Qualcosa di simile:

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

quale sarebbe andare dove? – Rabbott

+0

Nella tua app :) Chiamalo da 'onResume()' per gestire il caso quando l'utente elimina l'account e poi torna alla tua app. –

+0

Perfetto - come menzionato da @ zed-scio come impedire che l'altro intento venga visualizzato prima che venga visualizzata la schermata di accesso .. a questo punto il metodo onResume include solo il tuo codice e 'super.onResume();' ma l'intento che è impostato per mostrare come predefinito lampeggia – Rabbott

1

Nella tua 'EventListActivity' onCreate, controllare per vedere se ci sono dei conti. Se non ci sono, apri l'attività di Authenticator. Se vuoi eseguire il controllo e mostrare Authenticator, prima che l'interfaccia utente di EventListActivity mostri, è sufficiente aggiungere il codice prima di "setContentView" nel metodo onCreate.

+0

Quindi questo non è qualcosa che accade, lo faccio manualmente e lanciare l'intento? Ho pensato che Android avrebbe preso questo e l'avvio se non viene rilevato nulla .. – Rabbott

+0

Ho pensato che stavi dicendo che hai creato la tua classe AccountManager. Se questo non è il caso. Usa sotto –

0

Verificare se l'account esiste, in caso contrario accedere alla schermata di accesso.

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