Cambiar el nombre de una cuenta en Android (AccountManager)

Estoy cambiando el nombre de una aplicación publicada.

¿Existe una manera rápida y segura de cambiar el nombre de cuenta creado a través de AccountManager.addAccountExplicitly para que la información existente permanezca intacta para los usuarios existentes.

Si no es así, ¿cómo puedo cambiar el nombre de la cuenta manualmente mientras conservo todos los datos?

Voy a publicar una respuesta de mi enfoque ingenuo de copiar todo lo que luego eliminar el antiguo, pero estoy seguro de que alguien va a llegar a uno mejor (o detectar algunos errores en mi método).

2 Solutions collect form web for “Cambiar el nombre de una cuenta en Android (AccountManager)”

API v21 agregó un método renameAccount() al AccountManager , si eso ayuda.

De los documentos:

Esto equivale a eliminar la cuenta existente y agregar una nueva cuenta renombrada con los datos de usuario de la cuenta anterior.

Eso significa que para la compatibilidad con versiones anteriores, tendría que eliminar manualmente la cuenta y ejecutar a través del mismo procedimiento como crear uno nuevo ( AccountManager.addAccountExplicitly() y AccountManager.setUserData() ) después.

Editar: Si desea actualizar sus contactos posteriormente para mostrar el nombre de cuenta correcto, pruebe este código (no probado):

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

Un enfoque ingenuo de revisar todos los registros, copiarlos uno por uno y borrar todo lo viejo …

Realmente tengo miedo de que este método pueda fallar en los usuarios del mundo real.

 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! } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.