5

Z powodzeniem zapisuję kontakty w przeglądarce danych pulpitu nawigacyjnego parse.com za pomocą tego kodu.Jaki jest najlepszy sposób na uzyskanie różnych kontaktów w systemie Android?

public void readContacts(){ 
     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)); 
       String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
       if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) ==1) { 
        System.out.println(name); 
        ParseObject testObject = new ParseObject("Contacts"); 

        testObject.put("names", name); 

        // get the phone number 
        Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, 
              ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
              new String[]{id}, null); 
        while (pCur.moveToNext()) { 
          String phone = pCur.getString(
           pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
         System.out.println(phone); 
         testObject.put("phonenumber", phone); 

        } 
        pCur.close(); 
        testObject.saveInBackground(); 
      } 
     } 
    } 
    } 

Ale nie ma czeku na duplikaty kontaktów!

Przechowuje wszystkie duplikaty kontaktów z pamięci SIM/telefonu.

Jak można tego uniknąć?

Jednym z możliwych sposób moim zdaniem jest do przechowywania różnych nazw (Kontakt) w lokalnej bazie danych, a następnie pobierania & że dane przechowywać go w parse.com

Czy istnieje lepszy sposób?

góry dzięki ...

+0

Co to jest problem? Czy otrzymujesz duplikaty wpisów? –

+0

Tak, otrzymuję duplikaty wpisów takich samych, jakie są w moim telefonie. –

Odpowiedz

1

Set to kolekcja w Javie, który nie pozwala duplikaty. Możesz umieścić swoje dane w zestawie z numerem jako kluczem i nazwą jako wartością, aby uniknąć duplikowania liczb.

Później możesz pobrać je z zestawu i umieścić w obiekcie testObject, podając nazwę jako klucz i liczbę jako wartość.

+0

Czy możesz wyjaśnić więcej, jak to zrobić? –

3

Proszę zobaczyć poniższą metodę. Otrzymasz listę kontaktów, która nie ma zduplikowanych numerów telefonów.

public void readContacts() { 
     ContentResolver cr = getContentResolver(); 
     Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 

     ArrayList<ParseObject> contacts = new ArrayList<ParseObject>(); 
     ArrayList<String> list = new ArrayList<String>(); 
     if (cur.getCount() > 0) { 
      while (cur.moveToNext()) { 
       String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
       String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
       if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) == 1) { 
        System.out.println(name); 
        ParseObject testObject = new ParseObject("Contacts"); 

        testObject.put("names", name); 

        // get the phone number 
        Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id }, null); 
        while (pCur.moveToNext()) { 
         String phone = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
         System.out.println(phone); 
         testObject.put("phonenumber", phone); 
         if(!list.contains(phone)) { 
          contacts.add(testObject); 
         } 

         list.add(phone); 

        } 

        pCur.close(); 
        testObject.saveInBackground(); 
       } 
      } 
     } 
    } 
+0

Dzięki za odpowiedź! Ale ten sam problem istnieje i dlaczego używasz 'if (! List.contains (phone)) { contacts.add (testObject); } list.add (telefon); 'after testObject.put (* –

0

Oto rozwiązanie, że pracował dla ciebie .... Można przejść przez LogCat do informacji o tym, jak to działa w 100%

import java.util.ArrayList; 

import android.app.Activity; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.ContactsContract.CommonDataKinds.Phone; 
import android.provider.ContactsContract.Contacts; 

public class MainActivity extends Activity { 
    String ClsSimPhonename = null; 
    String ClsSimphoneNo = null; 

    public static ArrayList<String> phonecontact = new ArrayList<String>(); 
    public static ArrayList<String> simcontact = new ArrayList<String>(); 
    public static ArrayList<String> totalcontact = new ArrayList<String>(); 
    public static ArrayList<String> repeatedcontact = new ArrayList<String>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // get phone contact... 
     getphonecontact(); 
     // get sim contact... 
     getsimcard_contact(); 

     System.out.println("phone??? " + phonecontact); 
     System.out.println("sim??? " + simcontact); 

     System.out.println("sim_size??? " + simcontact.size()); 
     System.out.println("phone_size??? " + phonecontact.size()); 
     System.out.println("totalcontact_size??? " + totalcontact.size()); 

     // filter process beigins here.... 
     nowFilterContact(); 

    } 

    private void nowFilterContact() { 
     // TODO Auto-generated method stub 

     // determine which contact have more item.... 

     if (simcontact.size() > phonecontact.size()) { 

      onemorefiltermethod(simcontact.size(), simcontact, phonecontact); 

     } else { 
      onemorefiltermethod(phonecontact.size(), phonecontact, simcontact); 
     } 

    } 

    private void onemorefiltermethod(int size, ArrayList<String> contacts, 
      ArrayList<String> contact2) { 
     // TODO Auto-generated method stub 

     // compare both contact and get repeated contacts.... 
     for (int i = 0; i < size; i++) { 

      try { 
       if (contacts.contains(contact2.get(i))) { 

        // add repeated contacts to array.... 
        repeatedcontact.add(contact2.get(i)); 
       } 
      } catch (Exception e) { 

      } 

     } 

     System.out.println("repeatedcontact_size??? " + repeatedcontact.size()); 
     // now delete repeated contact from total contact 
     now_deletedrepeated_contact_from_total(); 
    } 

    private void now_deletedrepeated_contact_from_total() { 
     // TODO Auto-generated method stub 

     for (int i = 0; i < totalcontact.size(); i++) { 

      try { 
       if (totalcontact.contains(repeatedcontact.get(i))) { 
        totalcontact.remove(repeatedcontact.get(i)); 

       } 
      } catch (Exception e) { 

      } 

     } 
     System.out.println("Final contact size" + totalcontact.size()); 

     System.out.println("Final contact " + totalcontact); 

    } 

    private void getsimcard_contact() { 
     // TODO Auto-generated method stub 
     try { 
      Uri simUri = Uri.parse("content://icc/adn"); 
      Cursor cursorSim = this.getContentResolver().query(simUri, null, 
        null, null, null); 

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

       /* 
       * add contact from phone to array phone array and total array 
       */ 

       phonecontact.add(ClsSimphoneNo); 
       totalcontact.add(ClsSimphoneNo); 

      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    private void getphonecontact() { 
     // TODO Auto-generated method stub 
     try { 
      String[] PROJECTION = new String[] { Contacts._ID, 
        Contacts.DISPLAY_NAME, Phone.NUMBER }; 

      Cursor c = managedQuery(Phone.CONTENT_URI, PROJECTION, null, null, 
        null); 
      if (c.moveToFirst()) { 
       String ClsPhonename = null; 
       String ClsphoneNo = null; 

       do { 
        ClsPhonename = c.getString(c 
          .getColumnIndex(Contacts.DISPLAY_NAME)); 
        ClsphoneNo = c.getString(c.getColumnIndex(Phone.NUMBER)); 
        /* 
        * add contact from sim to array sim array and total array 
        */ 
        simcontact.add(ClsphoneNo); 
        totalcontact.add(ClsphoneNo); 

        ClsphoneNo.replaceAll("\\D", ""); 
        ClsPhonename = ClsPhonename.replaceAll("&", ""); 
        ClsPhonename.replace("|", ""); 
        String ClsPhoneName = ClsPhonename.replace("|", ""); 

       } while (c.moveToNext()); 
      } 
     } catch (Exception e) { 

     } 
    } 
} 

Pozwolenie

<uses-permission android:name="android.permission.READ_CONTACTS"/> 

Twoje dane wyjściowe są podane w metodzie now_deletedrepeated_contact_from_total().

Sprawdź wartość totalcontact tablica dla wyjścia końcowego

+0

Hmm dziękuję to działało, ale mogłoby być lepiej, gdyby również miało nazwy, w innej tablicy listy –

5

Łatwym podejście mogłoby być, aby załadować dane do MatrixCursor bez duplikatów danych. Na przykład załóżmy, że masz kursor c1 ma wiele kontaktów, ale potrzebujesz kursora bez duplikatów danych. Oto co można zrobić:

MatrixCursor mc = new MatrixCursor(new String[] { 
         Phone._ID, 
         Phone.DISPLAY_NAME_PRIMARY, 
         Phone.NUMBER 
}); 

String lastNumber = ""; 

while(c1.moveToNext()){ 
    String id = c1.getString(c1.getColumnIndexOrThrow(Phone._ID)); 
    String name = c1.getString(c1.getColumnIndexOrThrow(Phone.DISPLAY_NAME_PRIMARY))); 
    String number = c1.getString(c1.getColumnIndexOrThrow(Phone.NUMBER)); 

    //Some condition to check previous data is not matched and only then add row 
    if(!lastNumber.contains(number)){ 
      lastNumber = number; 
      mc.addRow(new String[]{id, name, number}); 
    } 


} 

c1.close(); 

Złóż wystąpienie MatrixCursor z samych kolumn, a następnie załadować jeśli ostatni numer lub nazwa kontaktu nie pasuje, że od poprzedniego kontaktu. Warunkiem sprawdzenia jest do ciebie. Dane należy przesyłać w określonej kolejności, aby zduplikowane kontakty były najpierw razem.

Po załadowaniu MatrixCursor można pobrać z niego dane. Możesz również dołączyć go do widoku za pomocą niestandardowego CursorLoader lub CursorAdapter.

+1

To działało idealnie, dziękuję bardzo! –

+0

Cieszę się, że to działało dla ciebie! – ZakiMak

Powiązane problemy