Livello di difficoltà: facileVersione SDK utilizzata: 2.3.3Link al file compresso del progetto eclipse: file in allegatoQuesto tutorial mostra come poter reperire le informazioni dai propri contatti in rubrica.
Creiamo prima un layout composto in questo esempio da un campo di testo editabile per inserire il dato recuperato e un bottone per accedere alla rubrica
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="match_parent" >
<EditText
android:layout_height="wrap_content"
android:id="@+id/invite_email"
android:inputType="textEmailAddress"
android:layout_width="wrap_content"
android:layout_toLeftOf="@+id/email_picker"
android:layout_alignParentLeft="true">
</EditText>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/email_picker"
android:text="browse"
android:layout_alignParentRight="true"
android:onClick="doLaunchContactPicker">
</Button>
</RelativeLayout> Prima di procedere bisogna inserire i permessi per poter accedere alla rubrica. Quindi nel file
AndroidManifest.xml bisognerà inserire
<uses-permission android:name="android.permission.READ_CONTACTS"/>Iniziamo quindi catturando l'azione sul bottone per lanciare l'apertura della rubrica, fattibile tramite gli
Intent e il metodo
startActivityForResult()public void doLaunchContactPicker(View view) {
Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
startActivityForResult(contactPickerIntent, CONTACT_PICKER_RESULT);
}Cliccando sul bottone ora sarà possibile visualizzare la propria rubrica telefonica. Ora bisogna gestire cosa succede quando si clicca su un contatto. Il risultato si reperisce richiamando il metodo
onActivityResult().
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
...
}Bisognerà prima verificare se tutto è andato bene testando se il
result code è uguale a
RESULT_OK (esito positivo).
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
switch (requestCode) {
case CONTACT_PICKER_RESULT:
...
break;
}
} else {
Toast.makeText(this, "Errore.", Toast.LENGTH_LONG).show();
}
}I dati che ci interessano sono contenuti nell'Intent
data e in particolare a noi interessa il tipo
UriUri result = data.getData(); Il cui contenuto sarà del tipo
content://com.android.contacts/contacts/lookup/0r7-2C46324E483C324A3A484634/7di cui a noi interessa solo l'ultimo numero, e per recuperarlo utilizziamo la funzione
String id = result.getLastPathSegment();Avendo ora l'id del contatto possiamo lanciare una query sulla DB dei contatti per recuperare le informazioni necessarie. In questo esempio recupereremo l'indirizzo email
cursor = getContentResolver().query(Email.CONTENT_URI, null, Email.CONTACT_ID + "=?", new String[]{id}, null);A questo punto avendo il cursore con i dati di richiesti possiamo recuperarli e inserirli nella casella di testo
email = cursor.getString(emailIdx);
EditText emailEntry = (EditText)findViewById(R.id.invite_email);
emailEntry.setText(email);Ecco il codice completo
package com.example.tutorial;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.Contacts;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class Main extends Activity {
private Cursor cursor;
private static final int CONTACT_PICKER_RESULT = 1001;
private String email;
public void onCreate(Bundle paramBundle) {
super.onCreate(paramBundle);
setContentView(R.layout.main);
}
public void doLaunchContactPicker(View view) {
Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
startActivityForResult(contactPickerIntent, CONTACT_PICKER_RESULT);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
switch (requestCode) {
case CONTACT_PICKER_RESULT:
cursor = null;
email = "";
try {
Uri result = data.getData();
String id = result.getLastPathSegment();
cursor = getContentResolver().query(Email.CONTENT_URI, null, Email.CONTACT_ID + "=?", new String[]{id}, null);
int emailIdx = cursor.getColumnIndex(Email.DATA);
if (cursor.moveToFirst()) {
email = cursor.getString(emailIdx);
}
} catch (Exception e) {
// errore recupero dei dati
} finally {
EditText emailEntry = (EditText)findViewById(R.id.invite_email);
emailEntry.setText(email);
if (email.length() == 0) {
Toast.makeText(this, "No email per il contatto.", Toast.LENGTH_LONG).show();
}
}
break;
}
} else {
Toast.makeText(this, "Errore.", Toast.LENGTH_LONG).show();
}
}
}In questo esempio si è recuperata la mail utilizzando
import android.provider.ContactsContract.CommonDataKinds.Email;
...
cursor = getContentResolver().query(Email.CONTENT_URI, null, Email.CONTACT_ID + "=?", new String[]{id}, null);
int emailIdx = cursor.getColumnIndex(Email.DATA);Ma si potrebbero recuperare altre informazioni, ad esempio il numero di telefono sostituendo i suddetti con
import android.provider.ContactsContract.CommonDataKinds.Phone;
...
cursor = getContentResolver().query(Phone.CONTENT_URI, null, Phone.CONTACT_ID + "=?", new String[]{id}, null);
int phoneIdx = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);sono inoltre anche utilizzabili
import android.provider.ContactsContract.CommonDataKinds.Photo;
import android.provider.ContactsContract.CommonDataKinds.Website;
import android.provider.ContactsContract.CommonDataKinds.Nickname;
import android.provider.ContactsContract.CommonDataKinds.Organization;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;Bibliografia: