【问题标题】:How to remove account in AccountManager in Android如何在 Android 的 AccountManager 中删除帐户
【发布时间】:2013-02-26 10:23:23
【问题描述】:

我正在尝试在 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>

帐户永远不会被删除,回调永远不会被调用,知道吗?日志中没有任何痕迹

【问题讨论】:

  • 你能解决这个问题吗?我面临着类似的问题。

标签: android accountmanager


【解决方案1】:

试试这个就行了

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

【讨论】:

  • 谢谢,但它不起作用。你基本上和我做同样的事情。 removeAccount() 函数什么都不做(顺便说一句,什么也不返回)。
  • @user2083698 你可能做错了,它在我的应用中完美运行
  • @user2083698 确保你有以上权限并且你的权限在 if 中匹配
  • 你错了,上面的代码不需要WRITE_SYNC_SETTINGS,而不是需要'GET_ACCOUNTS'和'MANAGE_ACCOUNTS'权限。如果我错了,请纠正我。
  • @DjHacktorReborn 您的代码正在工作。只有我们必须允许在 Authenticator 类中删除。 +1
【解决方案2】:

您需要从 AbstractAccountAuthenticator 覆盖 Authenticator 类中的以下方法。

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

【讨论】:

  • 您能否详细说明如何从AbstractAccountAuthenticator 覆盖Authenticator 类中的方法?根据我从您的回答中了解到的情况,假设 Vico 的代码在某个名为 public void removing(){} 的方法中,首先必须从某处调用类 AbstractAccountAuthenticator,然后在 Vico 的方法 removing 中的该类中粘贴您的方法getAccountRemovalAllowed 上面有文字 @Override。但我有点难以理解如何从 Vicos method removing` 到达 AbstractAccountAuthenticator 班级。
【解决方案3】:

遇到同样的问题

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()”后就可以使用了

我不知道 - 也许会有所帮助

【讨论】:

    【解决方案4】:

    您必须在 removeAccount 方法之前调用以下 2 个方法,系统将允许您在帐户管理器中删除该帐户。 清除密码 无效验证令牌

    根据 removeAccount 方法的描述:

    “身份验证器可能有自己的防止帐户删除的策略,在这种情况下,帐户不会被删除。”

    玩得开心。

    【讨论】:

      【解决方案5】:

      此准则对我来说就像是一种魅力。

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

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

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          【解决方案7】:

          我在 22 岁之前添加 Authenticator 类帮助了 api。从这个来源https://www.programcreek.com/java-api-examples/?code=MLNO/airgram/airgram-master/TMessagesProj/src/main/java/ir/hamzad/telegram/ContactsController.java#

          中激发自己的灵感

          对于 api 22+,这在没有 Authenticator 的情况下有效: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { Timber.e(String.valueOf(accountManager.removeAccountExplicitly(account))); }

          【讨论】:

            猜你喜欢
            • 2011-10-29
            • 2012-10-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-28
            • 1970-01-01
            • 2019-12-01
            • 2014-12-30
            相关资源
            最近更新 更多