Autore Topic: Recuperare informazioni dai contatti in rubrica  (Letto 1926 volte)

Offline maku85

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +34
    • Mostra profilo
  • Dispositivo Android:
    Sony Xperia J
  • Play Store ID:
    MaKu
  • Sistema operativo:
    Windows 8, Ubuntu 13.04
Recuperare informazioni dai contatti in rubrica
« il: 23 Aprile 2013, 13:54:38 CEST »
+1
Livello di difficoltà: facile
Versione SDK utilizzata: 2.3.3
Link al file compresso del progetto eclipse: file in allegato

Questo 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
Codice (XML): [Seleziona]
<?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

Codice (XML): [Seleziona]
<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()

Codice (Java): [Seleziona]
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().

Codice (Java): [Seleziona]
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).

Codice (Java): [Seleziona]
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 Uri

Codice (Java): [Seleziona]
Uri result = data.getData();
Il cui contenuto sarà del tipo

Codice (Java): [Seleziona]
content://com.android.contacts/contacts/lookup/0r7-2C46324E483C324A3A484634/7
di cui a noi interessa solo l'ultimo numero, e per recuperarlo utilizziamo la funzione

Codice (Java): [Seleziona]
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

Codice (Java): [Seleziona]
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

Codice (Java): [Seleziona]
email = cursor.getString(emailIdx);
EditText emailEntry = (EditText)findViewById(R.id.invite_email);
emailEntry.setText(email);

Ecco il codice completo

Codice (Java): [Seleziona]
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

Codice (Java): [Seleziona]
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

Codice (Java): [Seleziona]
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

Codice (Java): [Seleziona]
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:
« Ultima modifica: 23 Aprile 2013, 14:15:18 CEST da maku85 »
- Il programmatore è colui che risolve in un modo incomprensibile un problema che non sapevi di avere -

Offline Ormet

  • Utente junior
  • **
  • Post: 60
  • Respect: 0
    • Google+
    • Marco Falotico
    • Mostra profilo
  • Dispositivo Android:
    HTC One S
  • Play Store ID:
    Ormet
  • Sistema operativo:
    Windows 7
Re:Recuperare informazioni dai contatti in rubrica
« Risposta #1 il: 19 Maggio 2013, 19:16:11 CEST »
0
ottimo, quello che cercavo, ti meriti un bel thanks!
una domanda, qualcuno saprebbe dirmi come posso far compiere un'azione al telefono quando viene collegato al bluetooth?
vorrei che leggesse la rubrica del telefono quando in macchina..

Offline fondo89

  • Nuovo arrivato
  • *
  • Post: 1
  • Respect: 0
    • Mostra profilo
Re:Recuperare informazioni dai contatti in rubrica
« Risposta #2 il: 30 Maggio 2013, 11:49:18 CEST »
0
ciao :) ottima guida!
 cosi prende solo i numeri salvati sul cell ma quelli salvati nella sim nn li legge e siccome outuput== 0 stampa numero inesistente!
come posso far a recuperare pure i numeri salvati nella sim??

Offline maku85

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +34
    • Mostra profilo
  • Dispositivo Android:
    Sony Xperia J
  • Play Store ID:
    MaKu
  • Sistema operativo:
    Windows 8, Ubuntu 13.04
Re:Recuperare informazioni dai contatti in rubrica
« Risposta #3 il: 29 Luglio 2013, 15:13:48 CEST »
0
Per la lettura dei contatti da Sim ho trovato questa porzione di codice in rete:

Codice (Java): [Seleziona]
private void allSIMContact()
    {
        try
        {
            String ClsSimPhonename = null;
            String ClsSimphoneNo = null;

            Uri simUri = Uri.parse("content://icc/adn");
            Cursor cursorSim = this.getContentResolver().query(simUri,null,null,null,null);

            Log.i("PhoneContact", "total: "+cursorSim.getCount());

            while (cursorSim.moveToNext())
            {      
                ClsSimPhonename =cursorSim.getString(cursorSim.getColumnIndex("name"));
                ClsSimphoneNo = cursorSim.getString(cursorSim.getColumnIndex("number"));
                ClsSimphoneNo.replaceAll("\\D","");
                ClsSimphoneNo.replaceAll("&", "");
                ClsSimPhonename=ClsSimPhonename.replace("|","");

                Log.i("PhoneContact", "name: "+ClsSimPhonename+" phone: "+ClsSimphoneNo);
            }        
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }

Provato e funziona.
(Fonte: http://stackoverflow.com/questions/10412634/fetch-local-phonebook-contacts-from-sim-card-only-android )
- Il programmatore è colui che risolve in un modo incomprensibile un problema che non sapevi di avere -

Offline sgsone

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
Re:Recuperare informazioni dai contatti in rubrica
« Risposta #4 il: 30 Settembre 2013, 18:30:43 CEST »
0
Beh, ma se io ho già un numero di telefono e volessi risalire al nome? (Ammesso che ci sia..)

Offline giupardeb

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Glaxy SIII
Re:Recuperare informazioni dai contatti in rubrica
« Risposta #5 il: 11 Marzo 2014, 22:38:16 CET »
0
Ottima guida.. ma se volessi recuperare l'oggetto contatto? MI spiego meglio..ammettiamo che volessi recuperare un contatto da rubrica e inviarlo via bluetooth, il telefono che riceve deve capire che è un contatto telefonico e non una semplice stringa come il numero di telefono o una email.. MI sono spiegato ? xD Grazie :)