2013-03-11 12 views
8

Sto tentando di rimuovere un account personalizzato in AccountManager.Come rimuovere account in AccountManager in Android

Questo è il mio codice:

final Handler handler = new Handler(); 

AccountManagerCallback<Boolean> callback = new AccountManagerCallback<Boolean>() 
     { 
      @Override 
      public void run(AccountManagerFuture<Boolean> arg0) 
      { 
       String test = "test"; 
      } 
     }; 

AccountManagerFuture<Boolean> bool = am.removeAccount(account, callback, handler); 

Permessi sto usando:

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

L'account non è mai rimosso e la richiamata mai chiamato, qualche idea? Nessuna traccia nei registri

+0

Potrebbe risolvere questo Sto affrontando un problema simile –

risposta

11

Prova questa che funzionerà

// Global Variables 
    public static final String AUTHORITY = "com.example.package"; 
    public static final String ACCOUNT_TYPE = "com.example.package"; 
    public static final String ACCOUNT = "my_custom_account_name"; 

    // Account Manager definition 
    AccountManager accountManager = (AccountManager) this.getSystemService(ACCOUNT_SERVICE); 

    // loop through all accounts to remove them 
    Account[] accounts = accountManager.getAccounts(); 
    for (int index = 0; index < accounts.length; index++) { 
    if (accounts[index].type.intern() == AUTHORITY) 
     accountManager.removeAccount(accounts[index], null, null); 
    } 

richiede

<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" /> 
+0

Grazie, ma non funziona Stai fondamentalmente facendo la?.. la stessa cosa di me La funzione removeAccount() non fa nulla (e restituisce nulla btw). – Vico

+0

@ user2083698 si potrebbe fare qualcosa di sbagliato funziona perfettamente nella mia app – DjHacktorReborn

+0

@ user2083698 assicurati di avere sopra permesso e la tua autorità corrisponde a se – DjHacktorReborn

0

questo codice funziona come un fascino per me.

Avrete bisogno di WRITE_SYNC_SETTINGS, inoltre è necessario aggiungere android.permission.MANAGE_ACCOUNTS funziona per me con lo stesso modello di codice. autorizzazione. Quindi se usi correttamente AccountManager e Account, riuscirai a rimuovere l'account con successo.

Ho avuto alcuni problemi con l'account manager nel simulatore di Android, in modo da provare a testare su un dispositivo reale ...

AccountManager accMgr = AccountManager.get(this); 
final Account account = new Account(username, accountType); 

removeCaxtonAccount(accMgr, account); 

public void removeCaxtonAccount(AccountManager accMgr, Account account){ 
     accMgr.removeAccount(account, null,null); 
    } 
5

È necessario eseguire l'override del metodo seguito nella Authenticator classe da AbstractAccountAuthenticator.

public Bundle getAccountRemovalAllowed(AccountAuthenticatorResponse response, Account account) { 
    Bundle result = new Bundle(); 
    boolean allowed = true; // or whatever logic you want here 
    result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, allowed); 
    return result; 
} 
2

È necessario chiamare 2 metodi precedenti prima del metodo removeAccount e il sistema consentirà di rimuovere l'account in Gestione account. clearPassword invalidateAuthToken

Sulla base della descrizione del metodo removeAccount: "L'autenticatore può avere le proprie politiche di prevenzione cancellazione dell'account, nel qual caso non sarà cancellato l'account"

Buon divertimento.

0

Ecco la mia soluzione. Le soluzioni precedenti che ho trovato non aspettano esplicitamente la rimozione degli account per poter fallire in modo casuale.

final AccountManager accountManager = AccountManager.get(getContext()); 
    final String accountType = AuthenticatorService.ACCOUNT_TYPE; 

    final Account[] availableAccounts = accountManager.getAccountsByType(accountType); 
    for (final Account availableAccount : availableAccounts) { 
     final AccountManagerFuture<Boolean> booleanAccountManagerFuture = accountManager.removeAccount(availableAccount, null, null); 
     assertTrue("Impossible to delete existing account for this application", booleanAccountManagerFuture.getResult(1, TimeUnit.SECONDS)); 
    } 

Nota: sono ancora necessarie le autorizzazioni menzionate in precedenza.

0

avuto lo stesso problema

if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP_MR1) { 
      accountManager.removeAccount(account, {}, AContext.app.mainHandler) 
     } else { 
      accountManager.removeAccountExplicitly(account) 
     } 

Per API 22 e superiori funziona perfettamente, ma l'API 19 non ha funzionato affatto.

finalmente trovato il problema nel mio attuazione AbstractAccountAuthenticator:

override fun getAccountRemovalAllowed(response: AccountAuthenticatorResponse?, account: Account?): Bundle { 
    AccountHelper.removeAccount() 
    return super.getAccountRemovalAllowed(response, account) 
} 

E 'diventato a lavorare dopo l'eliminazione di "AccountHelper.removeAccount()"

Non lo so - forse vi aiuterà

+2

Questo in realtà non risponde alla domanda. Se hai una domanda diversa, puoi richiederla facendo clic su [Invia domanda] (https://stackoverflow.com/questions/ask). Puoi anche [aggiungere una taglia] (https://stackoverflow.com/help/privileges/set-bounties) per attirare maggiormente l'attenzione su questa domanda una volta che hai abbastanza [reputazione] (https://stackoverflow.com/help/ che cosa è-la reputazione). - [Dalla recensione] (/ recensione/post di bassa qualità/19035101) –

+0

Trovato la soluzione, modificato il post –

Problemi correlati