2017-01-11 1 views
1

Je travaille sur une application qui inclut également la gestion des contacts. J'ai essayé différentes méthodes Mais aucune d'entre elles n'a fonctionné. Je vais chercher des détails de contact dans un des fragments d'activité tabulés. Il récupère tous les autres détails correctement, sauf l'adresse e-mail du contact. Je ai compris la raison parce que ContactsContract.CommonDataKinds.Phone._ID chercher différents ID que ContactsContract.CommonDataKinds.Email.CONTACT_ID .. Maintenant, que dois-je code pour aller chercher tous les contacts du téléphone avec name, number, email, photo_uri. S'il vous plaît aidez! Voici mon morceau de code:Obtenir une valeur nulle lors de la récupération de l'adresse e-mail d'un contact

public class FragmentContacts extends Fragment{ 

ListView contacts; 
ArrayList<String> namelist=new ArrayList<String>(); 
ArrayList<String> number=new ArrayList<String>(); 
ArrayList<String> contact_id=new ArrayList<String>(); 
ArrayList<String> contact_image_uri=new ArrayList<String>(); 
ArrayList<String> contact_email=new ArrayList<String>(); 
String[] sortImage; 
ImageButton addContact; 
String email; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.fragment_contacts, container, false); 
    contacts=(ListView)rootView.findViewById(R.id.contact_list); 
    addContact=(ImageButton)rootView.findViewById(R.id.add_contact); 
    namelist.clear(); 
    getContacts(); 

    addContact.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      addNewContact(); 
     } 
    }); 
    return rootView; 
} 


public void getContacts() { 
    ContentResolver cr = getActivity().getApplicationContext().getContentResolver(); 

    Cursor managedCursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
      new String[]{ContactsContract.CommonDataKinds.Phone._ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER,ContactsContract.CommonDataKinds.Phone.PHOTO_URI}, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE NOCASE ASC"); 

    while (managedCursor.moveToNext()) { 

     String id = managedCursor.getString(0); 
     String name = managedCursor.getString(1); 
     String phoneNumber = managedCursor.getString(2); 
     String image_uri=managedCursor.getString(3); 
     //email=managedCursor.getString(4); 
     email=getEmail(id); 
     System.out.println("Email is "+email); 
     contact_id.add(id); 
     // System.out.println("Id is "+id+" "+"Name is "+name); 
     namelist.add(name); 
     number.add(phoneNumber); 
     contact_image_uri.add(image_uri); 
     contact_email.add(email); 
    } 
    managedCursor.close(); 



    ContactAdapter a = new ContactAdapter(getActivity(), contact_id, namelist, number,contact_image_uri,contact_email); 
    contacts.setAdapter(a); 
} 


public void addNewContact() 
{ 
    Intent in= new Intent(getContext(),AddContact.class); 
    startActivity(in); 
} 

private String getEmail(String contactId) { 

    String mailE=null; 
    ContentResolver cr = getActivity().getApplicationContext().getContentResolver(); 
    Cursor cursor = cr.query(
      ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
      null, 
      ContactsContract.CommonDataKinds.Email.CONTACT_ID +" = ?", 
      new String[]{contactId}, null); 

    while (cursor.moveToNext()) 
    { 
     mailE=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS)); 
     System.out.println("In Between Email is "+mailE); 
    } 

    cursor.close(); 
    return mailE; 
} 
} 
+0

Avez-vous essayé ce lien SO http://stackoverflow.com/questions/10117049/get-only-email-address-from- contact-list-android –

+0

http://stackoverflow.com/questions/25717989/cannot-retrieve-email-from-contacts – kgandroid

+1

Copie possible de [Obtenir uniquement l'adresse e-mail de la liste de contacts Android] (http://stackoverflow.com/ questions/10117049/get-only-email-address-from-contact-list-android) – Spartan

Répondre

0

Enfin, je l'ai résolu. J'ai changé contact_idContactsContract.CommonDataKinds.Phone._ID-ContactsContract.CommonDataKinds.Phone.CONTACT_ID ... Mon code est mise à jour:

public class FragmentContacts extends Fragment{ 

ListView contacts; 
ArrayList<String> namelist=new ArrayList<String>(); 
ArrayList<String> number=new ArrayList<String>(); 
ArrayList<String> contact_id=new ArrayList<String>(); 
ArrayList<String> contact_image_uri=new ArrayList<String>(); 
ArrayList<String> contact_email=new ArrayList<String>(); 
ImageButton addContact; 
String email; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.fragment_contacts, container, false); 
    contacts=(ListView)rootView.findViewById(R.id.contact_list); 
    addContact=(ImageButton)rootView.findViewById(R.id.add_contact); 
    namelist.clear(); 
    getContacts(); 

    addContact.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      addNewContact(); 
     } 
    }); 
    return rootView; 
} 


public void getContacts() { 
    ContentResolver cr = getActivity().getApplicationContext().getContentResolver(); 

    Cursor managedCursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
      new String[]{ContactsContract.CommonDataKinds.Phone.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER,ContactsContract.CommonDataKinds.Phone.PHOTO_URI}, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE NOCASE ASC"); 


    while (managedCursor.moveToNext()) { 

     String id = managedCursor.getString(0); 
     String name = managedCursor.getString(1); 
     String phoneNumber=managedCursor.getString(2); 
     String image_uri=managedCursor.getString(3); 
     email=getEmail(id); 
     contact_id.add(id); 
     namelist.add(name); 
     number.add(phoneNumber); 
     contact_image_uri.add(image_uri); 
     contact_email.add(email); 
    } 
    managedCursor.close(); 

    ContactAdapter a = new ContactAdapter(getActivity(), contact_id, namelist, number,contact_image_uri,contact_email); 
    contacts.setAdapter(a); 
} 


public void addNewContact() 
{ 
    Intent in= new Intent(getContext(),AddContact.class); 
    startActivity(in); 
} 

private String getEmail(String contactId) { 

    String mailE=null; 
    ContentResolver cr = getActivity().getApplicationContext().getContentResolver(); 
    Cursor cursor = cr.query(
      ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
      null, 
      ContactsContract.CommonDataKinds.Email.CONTACT_ID +" = ?", 
      new String[]{contactId}, null); 

    while (cursor.moveToNext()) 
    { 
     mailE=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS)); 
    } 

    cursor.close(); 
    return mailE; 
} 

} 
0

Pour récupérer votre courrier électronique Adresse e-mail,

String email = managedCursor .getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 

Essayez ceci.

+0

j'ai déjà essayé avec 'DATA' aussi .. toujours le même résultat –

+0

il lève toute exception .. –

+0

Essayez comme ceci http://stackoverflow.com/a/11669474/3514144 –

0

Vous pouvez vous cette méthode pour obtenir l'ID email de ce contact. Dans votre cas, vous pouvez passer l'identifiant du contact directement.

public ArrayList<String> getEmail() { 
     ArrayList<String> names = new ArrayList<String>(); 
     ContentResolver cr = getContentResolver(); 
     Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); 
     if (cur.getCount() > 0) { 
      while (cur.moveToNext()) { 
       String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
       Cursor cur1 = cr.query( 
         ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, 
         ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
           new String[]{id}, null); 
       while (cur1.moveToNext()) { 
        //to get the contact names 
        String name=cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
        Log.e("Name :", name); 
        String email = cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
        Log.e("Email", email); 
        if(email!=null){ 
         names.add(name); 
        } 
       } 
       cur1.close(); 
      } 
     } 
     return names; 
    } 
0

Il y a une certaine confusion dans votre code, vous ne pouvez pas interroger sur Phone.CONTENT_URI et vous attendre à obtenir une adresse e-mail, comme les courriels sont stockés dans Email.CONTENT_URI. La manière naïve serait d'ajouter une autre requête sur Email.CONTENT_URI, mais ce n'est pas nécessaire, votre meilleur choix serait d'interroger toute la table Data.CONTENT_URI qui contient à la fois des emails et des téléphones (et beaucoup d'autres types d'informations), et demandez seulement des mimetypes pour les emails et les téléphones.

String[] projection = new String[] { Data.CONTACT_ID, Data.DISPLAY_NAME, Data.MIMETYPE, Email.ADDRESS, Phone.NUMBER }; 
Cursor cur = getContentResolver().query(Data.CONTENT_URI, projection, Data.MIMETYPE + " IN ('" + Email.CONTENT_ITEM_TYPE + "' , '" + Phone.CONTENT_ITEM_TYPE +"')", null, null); 

while ((cur != null) && cur.moveToNext()) { 
    long contactId = cur.getLong(0); 
    String name = cur.getString(1); 
    String type = cur.getString(2); 
    String email = null; 
    String phone = null; 
    if (type == Email.CONTENT_ITEM_TYPE) { 
     email = cur.getString(3); 
    } else { 
     phone = cur.getString(4); 
    } 
    // do whatever you want with above variables. 
} 

Note: vous obtiendrez le même contactId et name pour chaque téléphone/courrier électronique stocké pour ce contact, vous devez donc utiliser une carte à HashMap contactID à la liste des détails, afin de stocker tout cela Les données.

Vous devez absolument lire d'abord les documents relatifs aux tables ContactsContract API et Contacts et Data, car ils sont essentiels pour comprendre comment interroger des informations sur les contacts.