Estou criando um aplicativo para Android e preciso ligar para a lista de contatos do telefone. Preciso chamar a função da lista de contatos, escolher um contato e retornar ao meu aplicativo com o nome do contato. Aqui está o código que obtive na internet, mas não funciona.
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.Contacts.People;
import android.view.View;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
public class Contacts extends ListActivity {
private ListAdapter mAdapter;
public TextView pbContact;
public static String PBCONTACT;
public static final int ACTIVITY_EDIT=1;
private static final int ACTIVITY_CREATE=0;
// Called when the activity is first created.
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
Cursor C = getContentResolver().query(People.CONTENT_URI, null, null, null, null);
startManagingCursor(C);
String[] columns = new String[] {People.NAME};
int[] names = new int[] {R.id.row_entry};
mAdapter = new SimpleCursorAdapter(this, R.layout.mycontacts, C, columns, names);
setListAdapter(mAdapter);
} // end onCreate()
// Called when contact is pressed
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Cursor C = (Cursor) mAdapter.getItem(position);
PBCONTACT = C.getString(C.getColumnIndex(People.NAME));
// RHS 05/06
//pbContact = (TextView) findViewById(R.id.myContact);
//pbContact.setText(new StringBuilder().append("b"));
Intent i = new Intent(this, NoteEdit.class);
startActivityForResult(i, ACTIVITY_CREATE);
}
}
Respostas:
Não tenho 100% de certeza do que seu código de amostra deve fazer, mas o seguinte trecho deve ajudá-lo a 'chamar a função da lista de contatos, escolher um contato e retornar ao [seu] aplicativo com o nome do contato'.
Existem três etapas para esse processo.
1. Permissões
Adicione uma permissão para ler os dados dos contatos no manifesto do aplicativo.
2. Chamando o Seletor de contatos
Na sua Atividade, crie uma Intenção que solicite ao sistema que encontre uma Atividade que possa executar uma ação PICK dos itens no URI de Contatos.
Chamada
startActivityForResult
, transmitindo essa Intenção (e um número inteiro do código de solicitação,PICK_CONTACT
neste exemplo). Isso fará com que o Android inicie uma atividade registrada para suporteACTION_PICK
no ePeople.CONTENT_URI
, em seguida, retorne a esta atividade quando a seleção for feita (ou cancelada).3. Escutando o resultado
Também em sua Atividade, substitua o
onActivityResult
método para escutar o retorno da atividade 'selecione um contato' que você iniciou na etapa 2. Você deve verificar se o código de solicitação retornado corresponde ao valor esperado e se o código de resultado éRESULT_OK
.Você pode obter o URI do contato selecionado chamando
getData()
o parâmetro Data Intent. Para obter o nome do contato selecionado, você precisa usar esse URI para criar uma nova consulta e extrair o nome do cursor retornado.Código fonte completo: tutorials-android.blogspot.com (como chamar a lista de contatos do Android) .
fonte
Eu faço dessa maneira para a versão do Android 2.2 Froyo: basicamente use o eclipse para criar uma classe como: public class SomePickContactName extends Activity
depois insira este código. Lembre-se de adicionar as variáveis de classe privada e CONSTANTS mencionados na minha versão do código:
fonte
Procurando uma solução de nível 5 da API usando a API ContactsContract, você pode modificar levemente o código acima com o seguinte:
E, em onActivityResult, use o nome da coluna:
fonte
Aqui está o trecho de código para obter contato:
}
fonte
fonte
porque sem selecionar nenhum contato, isso dará uma exceção. então é melhor verificar essa condição.
fonte
O código completo é fornecido abaixo
fonte
private static final int PICK_CONTACT = 1;
.Para minha surpresa, você não precisa da permissão do usuário CONTACT_READ para ler os nomes e algumas informações básicas (o contato foi marcado com estrela, qual foi a última vez que ligou)? No entanto, você precisa de permissão para ler os detalhes do contato, como o número de telefone.
fonte
Tenha cuidado ao trabalhar com a lista de contatos do Android.
A leitura da lista de contatos nos métodos acima funciona na maioria dos dispositivos Android, exceto HTC One e Sony Xperia. Desperdiçou minhas seis semanas tentando descobrir o que estava errado!
A maioria dos tutoriais disponíveis on-line é quase semelhante - primeiro leia "TODOS" os contatos e depois mostre
Listview
comArrayAdapter
. Esta não é uma solução eficiente em memória. Em vez de procurar soluções em outros sites primeiro, consulte developer.android.com. Se alguma solução não estiver disponível no developer.android.com, você deve procurar outro lugar.A solução é usar em
CursorAdapter
vez deArrayAdapter
recuperar a lista de contatos. O usoArrayAdapter
funcionaria na maioria dos dispositivos, mas não é eficiente. EleCursorAdapter
recupera apenas uma parte da lista de contatos em tempo de execução enquantoListView
está sendo rolada.Recuperando uma lista de contatos: Recuperando uma lista de contatos
fonte
fonte
oi eu tenho um código para salvar o contato no seu banco de dados por preferência compartilhada aqui está o meu código
fonte
fonte
Eu uso o código fornecido por @Colin MacKenzie - III. Muito obrigado!
Para alguém que está procurando uma substituição do managedQuery 'obsoleto':
1º, assumindo o uso da v4 support lib:
2º:
3rd,
4º, substituir retornos de chamada:
5 ª:
6º, o código acima , exceto que eu altero o parâmetro de assinatura de Intent para Cursor:
7, chame initLoader:
8º, não esqueça este pedaço de código
Referências:
Fundamentos do Android: carregamento correto de dados
Inicializando um carregador em uma atividade
fonte