在Android上重命名帐户(AccountManager)

时间:2012-10-25 16:09:34

标签: android android-contacts accountmanager batch-rename

我正在更改已发布应用的名称。

是否有一种快速安全的方法来更改通过AccountManager.addAccountExplicitly创建的帐户名称,以便现有用户的现有信息保持不变。

如果没有,我如何在保留所有数据的同时手动更改帐户名称?

我会发布一个天真的方法来回复所有内容然后删除旧内容,但我相信有人会想出一个更好的方法(或者在我的方法中发现一些错误)。

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

一种天真的方式来覆盖所有记录,逐个复制它们,并删除所有旧的东西......

我真的担心这种方法可能会对现实世界的用户造成失败。

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!
        }
    }