9

Attualmente sto visualizzando tutti i contatti del mio telefono nella mia app come una panoramica personalizzata. Fino ad ora visualizzo il nome, il numero di cellulare e l'immagine del profilo del contatto sulla vista dell'elenco, ma ho bisogno di ottenere tutte le informazioni per quel contatto e visualizzarlo quando si fa clic sulla voce di elenco della mia app in una pagina di dettaglio personalizzata.Come trovare e raccogliere tutte le informazioni disponibili in un contatto dare in qualsiasi telefono Android?

Per ogni contatto è disponibile un diverso insieme di informazioni, come in pochi contatti ho l'email ma per alcuni contatti non è presente.

Le mie domande sono

  1. Come posso ottenere tutte le informazioni di un determinato contatto senza perdere un solo bit.Is c'è una struttura che posso attraversare e verificare il valore per ogni chiave?

  2. Inoltre, quando compilo i contatti di sistema nell'elenco delle mie app, trovo lo stesso contatto più volte nell'elenco. Penso che ciò sia dovuto al fatto che nel gestore account del mio dispositivo lo stesso numero è registrato per molti account come whatsapp, gmail. In tal caso, come visualizzare quel numero solo una volta nella mia lista.

risposta

1

Ecco cosa puoi fare. avrete il vostro contactid modo basa su che è possibile salvare i dettagli come numeri di telefono, e-mail nella vostra oggetto personalizzato e utilizzare tale oggetto per visualizzare i dettagli

personalizzato di classe come ::

class Contact{ 
int contactId; 
String Name; 
ArrayList<Phone> phone; 
ArrayList<Email> emails; 
} 

class Phone{ 
String PhoneType; 
String number; 

} 

class Email{ 
String type; 
String EmailId; 

} 

dettagli retieve e aggiungerlo alla classe personalizzata:

ContentResolver cr = getContentResolver(); 
    Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, 
     "DISPLAY_NAME = '" + NAME + "'", null, null); 
    if (cursor.moveToFirst()) { 
     String contactId = 
      cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
     // 
     // Get all phone numbers. 
     // 
     Cursor phones = cr.query(Phone.CONTENT_URI, null, 
      Phone.CONTACT_ID + " = " + contactId, null, null); 
     while (phones.moveToNext()) { 
      String number = phones.getString(phones.getColumnIndex(Phone.NUMBER)); 
      int type = phones.getInt(phones.getColumnIndex(Phone.TYPE)); 
      switch (type) { 
       case Phone.TYPE_HOME: 
        // do something with the Home number here... 
        break; 
       case Phone.TYPE_MOBILE: 
        // do something with the Mobile number here... 
        break; 
       case Phone.TYPE_WORK: 
        // do something with the Work number here... 
        break; 
       } 
     } 
     phones.close(); 
     // 
     // Get all email addresses. 
     // 
     Cursor emails = cr.query(Email.CONTENT_URI, null, 
      Email.CONTACT_ID + " = " + contactId, null, null); 
     while (emails.moveToNext()) { 
      String email = emails.getString(emails.getColumnIndex(Email.DATA)); 
      int type = emails.getInt(emails.getColumnIndex(Phone.TYPE)); 
      switch (type) { 
       case Email.TYPE_HOME: 
        // do something with the Home email here... 
        break; 
       case Email.TYPE_WORK: 
        // do something with the Work email here... 
        break; 
      } 
     } 
     emails.close(); 
    } 
    cursor.close(); 

speranza che questo vi aiuterà

+0

si è ben coperto il nome, numero di telefono ed e-mail, ma ci sono altri campi anche in un contatto come stavo chiedendo un modo per analizzare tutti i dati che appartengono a un dato contatto. Ad esempio, la parte Indirizzo nei dispositivi Android include Strada, Città, Codice postale dello stato e Paese. Potrebbero esserci altri campi come indirizzo Web, organizzazione, note, nickname, relazione. anche eventi come i compleanni. Ora se un contatto contiene tutte queste informazioni, come posso recuperarlo. Questa è stata la mia prima domanda. –

+0

questo snippet è solo un esempio di come puoi coprire i dettagli nella tua classe personalizzata. in questo modo solo dovrai mettere tutti i dettagli nella tua classe personalizzata e creare una classe personalizzata separata come per i dettagli come nickname, relazione ecc; otterrai tutti i KEY_CONSTANTS per tutti i dettagli necessari dal solo contatto. devi solo aggiungerlo nella tua classe personalizzata questo è tutto. spero che questa idea ti possa aiutare. codifica felice. – KDeogharkar

0

forse questo metodo vi aiutano a:

public void getAllContacts() { 


    //region searchlist 
    ArrayList<SearchResult> results = new ArrayList<>(); 

    ContentResolver cr = SearchFragment.this.getActivity().getContentResolver(); 
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
    if (cur == null) 
     return; 
    if (cur.getCount() < 1) 
     return; 

    while (cur.moveToNext()) { 
     String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
     String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
     SearchResult temp = new SearchResult(); 
     temp.name = name; 
     if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
      Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{id}, null); 
      if (pCur == null) 
       continue; 
      // i need last phone number but you can add all numbers tu list in while loop 
      while (pCur.moveToNext()) { 
       temp.phone = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
      } 
      pCur.close(); 
     } else { 
      continue; 
     } 
     String strUri = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI)); 
     Uri tempUri = null; 
     if (strUri != null) 
      tempUri = Uri.parse(strUri); 
     if (tempUri != null) 
      temp.imageUri = tempUri; 
     else 
      //temp.profilePicture = getActivity().getResources().getDrawable(R.drawable.profile); 
      results.add(temp); 
      } 
//all you want is here in results 
    allContacts = results; 

    //searchListAdapter.addAll(allContacts); 
    //listSearch.setAdapter(searchListAdapter); 
    //listSearch.setOnItemClickListener(onItemClickListener); 
    //searchListAdapter.notifyDataSetChanged(); 

    //endregion 


} 
0

risposta a Q1:

consultare la open source "pacchetti/apps/ContactsCommon" pacchetto in AOSP. Questo ha il codice per leggere i dati completi di un contatto e caricarlo nella struttura dei dati. Questo è usato dagli schermi Android di default per rendere le informazioni. Puoi riutilizzare la stessa libreria senza reinventare la ruota.

Risposta a Q2: Idealmente, tali contatti devono essere uniti dalla logica Android predefinita e l'elenco dovrebbe rendere i contatti aggregati e non i contatti non elaborati.

Non ci sono risposte multiple disponibili per questo se si desidera rimuovere i duplicati dalla lista aggregata che Android non è riuscita ad aggregare: esempio: how to remove duplicate contact from contact list in android

Problemi correlati