在 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)的主要内容,如果未能解决你的问题,请参考以下文章

Woocommerce 如何在我的帐户页面上重定向自定义端点

如何在 GitHub 网站上重命名分支?

python 如何在Python上重命名文件的示例

在 Windows 上重命名 DLL

在 ruby​​ on rails 上重命名上传文件

在 Linux 上重命名多个文件,同时保持相同的扩展名