我正在尝试删除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 :(得分:12)
试试这个会起作用
// 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" />
答案 1 :(得分:7)
您需要在 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 :(得分:2)
您必须在removeAccount方法之前调用以下2个方法,系统将允许您删除帐户管理器中的帐户。 clearPassword invalidateAuthToken
基于removeAccount方法的说明:
“验证者可能有自己的政策阻止帐户删除,在这种情况下,帐户不会被删除。”
玩得开心。
答案 3 :(得分:2)
有同样的问题
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 :(得分: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 :(得分: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));
}
注意:您仍需要之前提到的权限。
答案 6 :(得分: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)));
}