在 Android 上重命名帐户 (AccountManager)
Posted
技术标签:
【中文标题】在 Android 上重命名帐户 (AccountManager)【英文标题】:Rename an account on Android (AccountManager) 【发布时间】:2012-10-15 21:10:53 【问题描述】:我正在更改已发布应用的名称。
是否有一种快速安全的方法来更改通过AccountManager.addAccountExplicitly
创建的帐户名称,以便现有用户的现有信息保持不变。
如果没有,如何在保留所有数据的同时手动更改帐户名称?
我将发布我复制所有内容然后删除旧的天真的方法的答案,但我相信有人会想出更好的方法(或发现我的方法中的一些错误)。
【问题讨论】:
【参考方案1】:API v21 向 AccountManager
添加了一个 renameAccount()
方法,如果有帮助的话。
来自文档:
这相当于删除现有帐户并添加一个新帐户 使用旧帐户的用户数据重命名帐户。
这意味着为了向后兼容,您必须手动删除帐户并执行与创建新帐户(AccountManager.addAccountExplicitly()
和 AccountManager.setUserData()
)相同的过程。
编辑: 如果您想在之后更新您的联系人以显示正确的帐户名称,请尝试以下(未经测试)代码:
ContentValues contentValues = new ContentValues();
contentValues.put(ContactsContract.RawContacts.ACCOUNT_NAME, "new account name");
getContext().getContentResolver().update(ContactsContract.RawContacts.CONTENT_URI,
contentValues,
ContactsContract.RawContacts.ACCOUNT_TYPE + " = ? AND " + ContactsContract.RawContacts.ACCOUNT_NAME + " = ?",
new String[]"your account type", "old account name");
【讨论】:
不错的新 api,谢谢。这是否还会修改联系人表以使保存在旧帐户下的所有联系人现在都在新帐户下? 我不认为它是自动完成的,因为您基本上创建了一个与旧帐户无关的新帐户。联系人提供者不知道发生了什么。我在答案中添加了一些代码来手动更新值。请看看这是否有效。 嗯,这是一个非常古老的问题,所以我无法检查代码,虽然它看起来很有希望,但我会将其标记为后代接受。 根据我的经验,您需要在重命名帐户之前使用@saschoar 提供的代码更新数据库,否则会删除联系人。【参考方案2】:一种幼稚的方法,遍历所有记录,一个一个地复制它们,然后删除所有旧的东西......
我真的担心这种方法可能会在现实世界的用户中失败。
private void naiveRename(ContentResolver resolver)
ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
Cursor cur = resolver.query(RawContacts.CONTENT_URI, null, RawContacts.ACCOUNT_NAME + "='"
+ "OLD NAME" + "'", null, null);
if (cur != null)
// copy all data
while (cur.moveToNext())
Uri curUri = RawContacts.CONTENT_URI.buildUpon()
.appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true")
.build();
ContentProviderOperation.Builder builder = ContentProviderOperation
.newInsert(curUri);
for (int i = 0; i < cur.getColumnCount(); i++)
String colName = cur.getColumnName(i);
if (RawContacts._ID.equals(colName) || RawContacts.VERSION.equals(colName)
|| RawContacts.CONTACT_ID.equals(colName))
// Skip - read only
else if (RawContacts.ACCOUNT_NAME.equals(colName))
builder.withValue(RawContacts.ACCOUNT_NAME, "NEW NAME");
else
builder.withValue(colName, cur.getString(i));
operationList.add(builder.build());
// delete all old data
ContentProviderOperation.Builder builder = ContentProviderOperation
.newDelete(RawContacts.CONTENT_URI);
builder.withSelection(RawContacts.ACCOUNT_NAME + "='" + "OLD NAME" + "'", null);
try
resolver.applyBatch(ContactsContract.AUTHORITY, operationList);
catch (RemoteException e)
// PANIC!
catch (OperationApplicationException e)
// OMG! WHAT TO DO?!
else
// LORDI!
【讨论】:
这似乎不起作用...我仍然在帐户和同步以及联系人数据中看到旧名称作为帐户。 我将其标记为答案,因为就我而言,发生不好的事情的可能性大于更改“帐户和同步”上的文本的好处,所以我们退缩 我猜这失败了,因为您要重命名每个联系人中的ACCOUNT_NAME
字段,而不是帐户本身。联系人通常与AccountManager
管理的账户无关。请看我的回答。以上是关于在 Android 上重命名帐户 (AccountManager)的主要内容,如果未能解决你的问题,请参考以下文章