5

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

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

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

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

4

2 回答 2

8

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"});
于 2015-02-18T09:40:36.963 回答
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!
        }
    }
于 2012-10-25T16:09:34.370 回答