[英]Rename an account on Android (AccountManager)
我正在更改已發布應用的名稱。
是否有快速安全的方法來更改通過AccountManager.addAccountExplicitly
明確創建的帳戶名稱,以便現有用戶的現有信息保持不變。
如果沒有,我如何在保留所有數據的同時手動更改帳戶名稱?
我會發布一個我天真的方法來回復所有內容然后刪除舊內容的答案,但我相信有人會想出一個更好的方法(或者在我的方法中發現一些錯誤)。
如果有幫助,API v21將一個renameAccount()
方法添加到AccountManager
。
來自文檔:
這相當於刪除現有帳戶並使用舊帳戶的用戶數據添加新的重命名帳戶。
這意味着為了向后兼容,您必須手動刪除帳戶,然后運行與創建新帳戶( 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"});
一種簡單的方法來覆蓋所有記錄,逐個復制它們,並刪除所有舊的東西......
我真的害怕這種方法可能會失敗對現實世界的用戶。
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!
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.