Читать контакты с телефона очень медленно - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь получить все контакты с моего телефона, включая получение всех номеров от контактов с несколькими номерами.

Итак, я построил запрос, который не перегружал все контакты, и собрал пользователя «Контакт», и создал внутренний запрос с выбором идентификатора, чтобы получить все числа для каждого пользователя.но так как мой внутренний запрос включает выбор, это занимает много времени.любая другая идея?

private Cursor initPhoneCursor() {
    try {

        // get the contacts URI
        final Uri phoneUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        // get the name column's name depending on the Android Version
        final String nameColumn = Contact.COLUMN_NAME_PHONE;


        // declare columns object - init later depending on version
        String selection = getQuerySelectionForCursor();

        String[] columns = getColumnSelectionForCursor(nameColumn);

        if (mApp != null) {
            // return cursor from contentresolver
            return mApp.getContentResolver().query(phoneUri, columns, selection, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
        }
    } catch (Exception e) {
        // couldn't read phone cursor

        CaughtExceptionHandler.reportException(e);
    }
    return null;
}

private void importContactsFromCursor(Cursor cursor, boolean isSimCard) {


    mCurrentContactCursor = initPhoneCursor();

    // check cursor is alive
    if (cursor != null && !cursor.isClosed()) {

        while (cursor.moveToNext() && shouldContinueImport()) {

//                // as log as we have contacts, move through them
            importContact(cursor, isSimCard);

            mCurrentContact++;

        }
        // when done - close the cursor
        cursor.close();
    }
}

private void importContact(Cursor cursor, boolean simCard) {

    // create Contact object
    Contact row = new Contact(cursor, simCard);

//        mContactsTimer.onContactCreated();


    if (simCard) {
        // if simCard, contact must have number

        // validate number and create contact
        row = validateAndCheckNumber(row, cursor);

    }
    else {
        // if not sim card (phone cursor), a contact might have no numbers,
        // single or multiple phone numberss

        // let's check if this contact has any numbers
        if (hasPhoneNumbers(cursor)) {

            // get all of the contact's phone numbers
            row = importAllNumbersForContact(row);

        }

    }

    // check if this is valid
    final boolean isValidForSaving = row != null && row.hasName() && row.hasNumbers();

    if (isValidForSaving && !sStopRequested) {

        mContactsToSave.add(row);
    }

}

private Contact importAllNumbersForContact(Contact contact) {

    // uri of contact phones
    Uri contentUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;

    // contact_id = ?
    String selection = ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?";
    String[] selectionArgs = {String.valueOf(contact.getOriginalId())};

    // do the query
    Cursor phoneCursor = mApp.getContentResolver().query(contentUri, null, selection, selectionArgs, null);

    if (phoneCursor != null) {

        // save numbers if we got anything
        contact = loopThroughContactNumbers(contact, phoneCursor);


        // close cursor when done
        phoneCursor.close();

    }
    return contact;
}

1 Ответ

0 голосов
/ 23 января 2019

Используйте следующее решение:

Map<String,Contact> contactsMap = new TreeMap<>();
    contacts = new ArrayList<>();

    Cursor phones = getBaseContext().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME+" ASC");
    assert phones != null;
    while (phones.moveToNext())
    {
        Contact contact = new Contact();
        contact.setDisplayName(phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)));
        contact.setPhoneNumber(phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
        contact.setDisplayPicture(phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_THUMBNAIL_URI)));
        contactsMap.put(phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)),contact);
    }

    contacts.addAll(contactsMap.values());
    phones.close();

Измените его для всех номеров контакта.С тобой все в порядке.

...