android - telefono - ¿Cómo actualizar el contacto existente?
gmail google contact (6)
// Lo siento por mi mal inglés // Parece que en la primera publicación se olvidó de agregar el MimeType
en operación.
String selectPhone = Data.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=''" +
ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE + "''" ;
String[] phoneArgs = new String[]{String.valueOf(rawContactId)};
ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
.withSelection(selectPhone, phoneArgs)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, STREET)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.CITY, CITY)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.REGION, REGION)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, POSTCODE)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, POSTCODE)
**
// Simplemente agregue esta línea
.withValue(Data.MIMETYPE, "vnd.android.cursor.item/postal-address_v2")
**
.build());
this.context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
Por favor revisa esto y hazme saber el resultado.
Tengo un contacto existente, necesito agregar una dirección de trabajo a ese contacto existente. Estoy usando el siguiente código, pero no funciona.
String selectPhone = Data.CONTACT_ID + "=? AND " + Data.MIMETYPE + "=''" +
ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE +
"''" + " AND " + ContactsContract.CommonDataKinds.StructuredPostal.TYPE + "=?";
String[] phoneArgs = new String[]
{String.valueOf(ContactId), String.valueOf(
ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK)};
ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
.withSelection(selectPhone, phoneArgs)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, STREET)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.CITY, CITY)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.REGION, REGION)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, POSTCODE)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, COUNTRY)
.build());
this.context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
¿Alguna solución para esto?
Cada campo (correo electrónico, nombre, dirección) tiene su propio tipo de mime, que debe usar para actualizar el campo.
Trabajaremos con la tabla de datos, donde cada Data.RAW_CONTACT_ID representa un detalle sobre algún contacto.
Por lo tanto, debemos encontrar el Data.RAW_CONTACT_ID donde id es el id del contacto que desea editar.
Espero que este código te sea de utilidad.
String selectPhone = Data.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=''" +
ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE + "''" ;
String[] phoneArgs = new String[]{String.valueOf(rawContactId)};
ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
.withSelection(selectPhone, phoneArgs)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, STREET)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.CITY, CITY)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.REGION, REGION)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, POSTCODE)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, POSTCODE)
.build());
this.context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
Si se ha creado un nuevo contacto, pero sin dirección, y ahora desea agregar una dirección a ese contacto. En este caso, use la misma consulta anterior, pero simplemente cambie newUpdate a newInsert, ya que dicha fila aún no existe.
Finalmente encontré la solución adecuada ... Muchas gracias a esto Cómo modificar el contacto existente
El secreto es que tiene que pasar dos valores para .withSelection como se muestra a continuación:
.withSelection(Data.RAW_CONTACT_ID + " = ?", new String[] {String.valueOf(id)})
.withSelection(Data._ID + " = ?", new String[] {mDataId})
donde por Data._ID el valor mDataId se obtiene de esta manera:
Cursor mDataCursor = this.context.getContentResolver().query(
Data.CONTENT_URI,
null,
Data.RAW_CONTACT_ID + " = ? AND " + Data.MIMETYPE + " = ?",
new String[] { String.valueOf(id), ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE},
null);
if(mDataCursor.getCount() > 0) {
mDataCursor.moveToFirst();
mDataId = getCursorString(mDataCursor, Data._ID);
MLog.v("Data", "Found data item with MIMETYPE");
mDataCursor.close();
} else {
MLog.v("Data", "Data doesn''t contain MIMETYPE");
result = ERROR;
mDataCursor.close();
}
Y el método getCursorString es algo así como:
private static String getCursorString(Cursor cursor, String columnName) {
int index = cursor.getColumnIndex(columnName);
if(index != -1) return cursor.getString(index);
return null;
}
Este y solo este es el truco ..
Tal vez podría usar Intent y su ACTION_EDIT para que su usuario edite la dirección de trabajo ...
debe usar "Data.RAW_CONTACT_ID" en lugar de "Data.CONTACT_ID" en la cláusula de selección.
/**
* @param name name of the contact
* @param number mobile phone number of contact
* @param email work email address of contact
* @param ContactId id of the contact which you want to update
* @return true if contact is updated successfully<br/>
* false if contact is not updated <br/>
* false if phone number contains any characters(It should contain only digits)<br/>
* false if email Address is invalid <br/><br/>
*
* You can pass any one among the 3 parameters to update a contact.Passing all three parameters as <b>null</b> will not update the contact
* <br/><br/><b>Note: </b>This method requires permission <b>android.permission.WRITE_CONTACTS</b><br/>
*/
public boolean updateContact(String name, String number, String email,String ContactId)
{
boolean success = true;
String phnumexp = "^[0-9]*$";
try
{
name = name.trim();
email = email.trim();
number = number.trim();
if(name.equals("")&&number.equals("")&&email.equals(""))
{
success = false;
}
else if((!number.equals(""))&& (!match(number,phnumexp)) )
{
success = false;
}
else if( (!email.equals("")) && (!isEmailValid(email)) )
{
success = false;
}
else
{
ContentResolver contentResolver = activity.getContentResolver();
String where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
String[] emailParams = new String[]{ContactId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE};
String[] nameParams = new String[]{ContactId, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE};
String[] numberParams = new String[]{ContactId, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE};
ArrayList<android.content.ContentProviderOperation> ops = new ArrayList<android.content.ContentProviderOperation>();
if(!email.equals(""))
{
ops.add(android.content.ContentProviderOperation.newUpdate(android.provider.ContactsContract.Data.CONTENT_URI)
.withSelection(where,emailParams)
.withValue(Email.DATA, email)
.build());
}
if(!name.equals(""))
{
ops.add(android.content.ContentProviderOperation.newUpdate(android.provider.ContactsContract.Data.CONTENT_URI)
.withSelection(where,nameParams)
.withValue(StructuredName.DISPLAY_NAME, name)
.build());
}
if(!number.equals(""))
{
ops.add(android.content.ContentProviderOperation.newUpdate(android.provider.ContactsContract.Data.CONTENT_URI)
.withSelection(where,numberParams)
.withValue(Phone.NUMBER, number)
.build());
}
contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
}
}
catch (Exception e)
{
e.printStackTrace();
success = false;
}
return success;
}
// To get COntact Ids of all contact use the below method
/**
* @return arraylist containing id''s of all contacts <br/>
* empty arraylist if no contacts exist <br/><br/>
* <b>Note: </b>This method requires permission <b>android.permission.READ_CONTACTS</b>
*/
public ArrayList<String> getAllConactIds()
{
ArrayList<String> contactList = new ArrayList<String>();
Cursor cursor = activity.managedQuery(ContactsContract.Contacts.CONTENT_URI, null, null, null, "display_name ASC");
if (cursor != null)
{
if (cursor.moveToFirst())
{
do
{
int _id = cursor.getInt(cursor.getColumnIndex("_id"));
contactList.add(""+_id);
}
while(cursor.moveToNext());
}
}
return contactList;
}
private boolean isEmailValid(String email)
{
String emailAddress = email.toString().trim();
if (emailAddress == null)
return false;
else if (emailAddress.equals(""))
return false;
else if (emailAddress.length() <= 6)
return false;
else {
String expression = "^[a-z][a-z|0-9|]*([_][a-z|0-9]+)*([.][a-z|0-9]+([_][a-z|0-9]+)*)?@[a-z][a-z|0-9|]*//.([a-z][a-z|0-9]*(//.[a-z][a-z|0-9]*)?)$";
CharSequence inputStr = emailAddress;
Pattern pattern = Pattern.compile(expression,
Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(inputStr);
if (matcher.matches())
return true;
else
return false;
}
}
private boolean match(String stringToCompare,String regularExpression)
{
boolean success = false;
Pattern pattern = Pattern.compile(regularExpression);
Matcher matcher = pattern.matcher(stringToCompare);
if(matcher.matches())
success =true;
return success;
}