11

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>

アカウントが削除されることはなく、コールバックが呼び出されることもありません。ログにトレースなし

4

7 に答える 7

14

これを試してみてください

    // 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" />
于 2013-03-11T09:42:10.600 に答える
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;
}
于 2014-05-29T05:16:55.683 に答える
2

removeAccount メソッドの前に、以下の 2 つのメソッドを呼び出す必要があります。これにより、アカウント マネージャーでアカウントを削除できるようになります。clearPassword 無効な認証トークン

removeAccount メソッドの説明に基づいて:

「オーセンティケーターには、アカウントの削除を防止する独自のポリシーがある場合があり、その場合、アカウントは削除されません。」

楽しむ。

于 2015-03-12T19:39:39.223 に答える
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));
    }

注: 前述のアクセス許可が引き続き必要です。

于 2016-01-12T11:02:09.363 に答える
0

この規範は私にとって魅力のように機能します。

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);
    }
于 2014-01-23T10:51:46.117 に答える