如何在Android中的AccountManager中删除帐户

问题描述 投票:10回答:7

我试图删除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
7个回答
13
投票

试试这个它会起作用

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

8
投票

您需要在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;
}

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()”后它开始工作了

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


2
投票

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

基于removeAccount方法的描述:

“验证者可能有自己的政策阻止帐户删除,在这种情况下,帐户不会被删除。”

玩得开心。


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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.