Новое приложение, мне нужно импортировать все контакты с мобильного телефона,

Я запускаю приведенный ниже код в классе AsyncTask.

Он работает нормально, но очень медленно, на устройстве с 2000 контактами устройство зависает на несколько мгновений. Я знаю, что это можно сделать намного быстрее, поскольку многие приложения используют контакты.

Любые идеи?

    public ArrayList<ContactInfo> getContacts() {
        ArrayList<ContactInfo> arrayList = new ArrayList<ContactInfo>();
        ContentResolver cr = GlobalData.instance().getContext().getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, Phone.DISPLAY_NAME + " ASC");
        String id;
        String name;
        int counter = 0;

    if (cur.getCount() > 0) {
        int indexId= cur.getColumnIndex(ContactsContract.Contacts._ID);
        int indexName = cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
        int indexHasPhoneNum = cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER);
        Log.d("getContacts", "Start");
        while (cur.moveToNext()) {
            id = cur.getString(indexId);
            name = cur.getString(indexName);
            if (Integer.parseInt(cur.getString(indexHasPhoneNum)) > 0) {
                // Query phone here. Covered next
                Cursor phones = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + id, null, null);
                while (phones.moveToNext()) {                   
                    int type = phones.getInt(phones.getColumnIndex(Phone.TYPE));
                    if(type == Phone.TYPE_MOBILE){
                        String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                        arrayList.add(new ContactInfo(name, phoneNumber));
                        counter++;
                    }
                }
                phones.close();
            }

        }
        Log.d("getContacts", "End (" + counter + ")" );
    }
    cur.close();
    return arrayList;
3
Arnold 26 Мар 2014 в 14:10

1 ответ

Лучший ответ

После некоторого поиска с другими ресурсами и некоторого здравого смысла ответ для получения всех мобильных телефонов в устройстве - запросить ContactsContract.CommonDataKinds.Phone.CONTENT_URI вместо ContactsContract.Data.CONTENT_URI и навести на него курсор.

3
Arnold 8 Апр 2014 в 10:41