What is the best way to get distinct contacts in A

2019-01-24 13:09发布

I am successfully storing contacts in parse.com dashboard data browser by this code.

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();
           }
        }
     }
  }

But there is no check for the duplicate contacts !

It stores all the contacts duplicate from sim / phone memory.

How can it be avoided ?

One possible method I think is to store distinct names(contact) in local database, & then retrieving that data to store it in parse.com

Is there exists a better way ?

Thanks in advance...

4条回答
我命由我不由天
2楼-- · 2019-01-24 13:34

Please see the below method. You will get contacts list which does not have duplicate phone numbers.

 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();
                }
            }
        }
    }
查看更多
等我变得足够好
3楼-- · 2019-01-24 13:38

Here is the Solution that i worked out for you.... You can go through the logcat for information about how it works 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) {

        }
    }
}

Permission

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

Your output is on now_deletedrepeated_contact_from_total() method.

Check totalcontact array value for Final output

查看更多
别忘想泡老子
4楼-- · 2019-01-24 13:41

An easy approach could be to load the data to a MatrixCursor with no duplicate data. For example lets assume you have a cursor c1 will many contacts, but you need a cursor with no duplicate data. Here is what you could do:

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();

Make an instance of MatrixCursor with same columns, and then load if last number or contact name does not match that of the previous contact. The condition for checking is upto you. Query data in some order so that the duplicate contacts stay together first.

Once the MatrixCursor is loaded you can fetch data from it. You could also attach it to a view through a custom CursorLoader or CursorAdapter.

查看更多
够拽才男人
5楼-- · 2019-01-24 13:46

Set is a collection in java that does not allow duplicates. You can put your data into a set with number as a key and name as value, to avoid duplicate numbers.

And later you can take them back from set and put into your testObject with name as key and number as value.

查看更多
登录 后发表回答