2013-03-11 127 views
8

我试图在AccountManager中删除自定义帐户。如何在Android的AccountManager中删除帐户

这是我的代码:

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

许可我使用:

<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> 

的账户永远不会被删除,并且回调从来不叫,任何想法?在日志中没有一丝

+0

你能解决这个我现在面临一个类似的问题 – 2014-09-15 11:24:08

回答

11

试试这个它会工作

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

需要

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

谢谢,但它不工作 你基本上做的?。同样的事情我。 的removeAccount()函数不会做任何事情(和BTW返回任何结果)。 – Vico 2013-03-11 12:38:44

+0

@ user2083698你可能会做错事了完美的作品在我的应用程序 – DjHacktorReborn 2013-03-11 12:41:44

+0

@ user2083698请确保您有上面的权限和你的权威如果在添加 – DjHacktorReborn 2013-03-11 12:43:57

0

此代码的工作就像一个魅力对我来说。

您将需要WRITE_SYNC_SETTINGS,也需要添加android.permission.MANAGE_ACCOUNTS为我工作与相同的代码模式。允许。因此,如果您正确使用AccountManager和帐户,您将成功删除该帐户。

我不得不使用在Android模拟器的客户经理,所以尝试测试在真实设备上的一些问题...

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

您需要从重写以下方法在验证器类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

您必须在removeAccount方法之前调用以下2个方法,并且系统将允许您删除帐户管理器中的帐户。 clearPassword invalidateAuthToken

基于对removeAccount方法说明:

“的鉴别器可以有自己的政策,防止帐户删除,在这种情况下,帐户将不会被删除。”

玩得开心。

0

这是我的解决方案。我发现的以前的解决方案并没有明确地等待帐户的删除完成,因此他们随机失败。

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

注意:您仍然需要前面提到的权限。

0

有同样的问题

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

对于API 22个更高的作品完美,但在API 19并没有在所有的工作。

终于发现了问题我在执行AbstractAccountAuthenticator的:

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

它成为删去“AccountHelper后,开始工作。removeAccount()”

我不知道 - 也许它会帮助

+2

这并没有真正回答这个问题。如果您有不同的问题,可以通过单击[提问](https://stackoverflow.com/questions/ask)来提问。您可以[添加赏金](https://stackoverflow.com/help/privileges/set-bounties)在您拥有足够的[声誉](https://stackoverflow.com/help/)后吸引更多关注此问题什么声誉)。 - [来自评论](/ review/low-quality-posts/19035101) – 2018-03-07 16:12:48

+0

找到解决方案,编辑帖子 – 2018-03-08 08:20:18