sexta-feira, 30 de abril de 2010

Inserindo Contatos no Android

Olá povo,

Segue abaixo um exemplo de como adicionar um registro na agenda de contatos no Android. A partir da versão 2.0 do Android, a agenda armazena as informações em formato mestre/detalhe. Onde o registro mestre contém o id interno do contato, seu nome e sobrenome. Já os detalhes podem ser: endereço, e-mails, telefones, etc. Os telefones por sua vez, podem ser: Mobile, Mobile Work, Home, Work, Fax, etc.

Dessa forma, a inclusão terá que ser feita em uma transação só, ou seja, em batch.


// Lista de operações que serão realizadas em batch
ArrayList<ContentProviderOperation> operation =
new ArrayList<ContentProviderOperation>();

// Armazerá o id interno do contato
// e servirá para inserir os detalhes
int backRefIndex = 0;

// Associa o contato à conta padrão do telefone
operation.add(
ContentProviderOperation.newInsert(
RawContacts.CONTENT_URI).
withValue(RawContacts.ACCOUNT_TYPE, null).
withValue(RawContacts.ACCOUNT_NAME, null).build()
);

// Adiciona o nome do contato e alimenta id
operation.add(
ContentProviderOperation.newInsert(
Data.CONTENT_URI).
withValueBackReference(Data.RAW_CONTACT_ID,
backRefIndex).
withValue(Data.MIMETYPE,
StructuredName.CONTENT_ITEM_TYPE).
withValue(StructuredName.DISPLAY_NAME, "Fulano").
build()
);

// Adiciona um endereço ao contato a partir do id
operation.add(
ContentProviderOperation.newInsert(
Data.CONTENT_URI).
withValueBackReference(Data.RAW_CONTACT_ID,
backRefIndex).
withValue(Data.MIMETYPE,
StructuredPostal.CONTENT_ITEM_TYPE).
withValue(StructuredPostal.FORMATTED_ADDRESS,
"Rua do bolo").
build()
);

// Associa um telefone ao contato do tipo "Home"
operation.add(
ContentProviderOperation.newInsert(
Data.CONTENT_URI).
withValueBackReference(Data.RAW_CONTACT_ID,
backRefIndex).
withValue(Data.MIMETYPE,
Phone.CONTENT_ITEM_TYPE).
withValue(Phone.NUMBER, telefone).
withValue(Phone.TYPE, Phone.TYPE_HOME).
withValue(Phone.LABEL, "88999988").build());

// Aplica o batch de inclusão
getContentResolver().applyBatch(
ContactsContract.AUTHORITY, operation);


Pronto! Abaixo podemos ver o resultado na aplicação de contatos:



4br4ç05,
nglauber

2 comentários:

Pablo Baldez Silva disse...

Olá, colega! Eu tenho uma aplicação que necessita saber quando um contato é inserido na agenda do android. Saberia me dizer se existe uma INTENT para isso? uso uma classe que herde a BroadcastReceiver?

Nelson Glauber disse...

Olá Pablo,

O que você precisa é criar uma classe que herde de android.database.ContentObserver, depois registra-la.

MeuContentObserver contentObserver = new MeuContentObserver();
context.getContentResolver().registerContentObserver(ContactsContract.Contacts..CONTENT_URI, true, contentObserver);

Dá uma olhada aqui:
http://developer.android.com/reference/android/database/ContentObserver.html
e aqui
http://www.anddev.org/other-coding-problems-f5/any-listener-for-added-updated-and-deleted-contacts-t15230.html

4br4ç05,
nglauber