Android Невозможно программно обновить контактные данные в локальной телефонной книге - PullRequest
0 голосов
/ 08 мая 2020
• 1000 это детали.

Ниже приведен код, который я пытаюсь выполнить. Он выполняется без ошибок, но нет нескольких мобильных номеров, стационарных телефонов, адресов электронной почты и т.д. тоже не помогло.

String whereMobile = ContactsContract.Data.RAW_CONTACT_ID + " = ? AND " +
            ContactsContract.Data.MIMETYPE + " = ? AND " +
            ContactsContract.CommonDataKinds.Phone.TYPE + " = ? ";

    String[] paramsMobile = new String[]{String.valueOf(contactID),
            ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE,
            String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)};


    if (userInfoMobileNos != null && !userInfoMobileNos.isEmpty()) {
        for (int iUserMobile = 0; iUserMobile < userInfoMobileNos.size(); iUserMobile++) {

            operationList.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
                    .withSelection(whereMobile, paramsMobile)
                    .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, userInfoMobileNos.get(iUserMobile).getPhoneNumber())
                    .build());
        }

    }


String whereGmail = ContactsContract.Data.RAW_CONTACT_ID + " = ? AND " +
                ContactsContract.Data.MIMETYPE + " = ? AND " +
                ContactsContract.CommonDataKinds.Email.TYPE + " = ? ";

    String[] paramsGmail = new String[]{String.valueOf(contactID),
    ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE,
    String.valueOf(ContactsContract.CommonDataKinds.Email.TYPE_WORK)};

    if (userInfoGmails != null && !userInfoGmails.isEmpty()) {
    for (int iUserGmail = 0; iUserGmail < userInfoGmails.size(); iUserGmail++) {

      operationList.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
                        .withSelection(whereGmail, paramsGmail)
                        .withValue(ContactsContract.CommonDataKinds.Email.DATA, userInfoGmails.get(iUserGmail).getEmail())
                        .build());
    }

}

Обновленный код

private void updateNew(Context context, int rawContactID) {
        ArrayList<ContentProviderOperation> operationList = new ArrayList<>();

        String whereMobile = ContactsContract.Data.RAW_CONTACT_ID + " = ? AND " +
                ContactsContract.Data.MIMETYPE + " = ? AND " +
                ContactsContract.CommonDataKinds.Phone.TYPE + " = ? ";

        String[] paramsMobile = new String[]{String.valueOf(rawContactID),
                ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE,
                String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)};

// First delete all the existing phones with type mobile, if any exist
        operationList.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI)
                .withSelection(whereMobile, paramsMobile)
                .build());

// Next, insert all the updated phones:
        for (MobileNumbersItem infoMobileNo : userInfoMobileNos) { // <== change the class to the one you're using in userInfoMobileNos
            operationList.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) // <== insert not update!
                    .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID)
                    .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
                    .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
                    .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, infoMobileNo.getPhoneNumber())
                    .build());
        }

        String whereGmail = ContactsContract.Data.RAW_CONTACT_ID + " = ? AND " +
                ContactsContract.Data.MIMETYPE + " = ? AND " +
                ContactsContract.CommonDataKinds.Email.TYPE + " = ? ";

        String[] paramsGmail = new String[]{String.valueOf(rawContactID),
                ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE,
                String.valueOf(ContactsContract.CommonDataKinds.Email.TYPE_WORK)};

        // First delete all the existing emails with type work, if any exist
        operationList.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI)
                .withSelection(whereGmail, paramsGmail)
                .build());

        // Next, insert all the updated emails:
        for (GmailsItem userInfoGmail : userInfoGmails) { // <== change the class here too
            operationList.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                    .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID)
                    .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
                    .withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK)
                    .withValue(ContactsContract.CommonDataKinds.Email.DATA, userInfoGmail.getEmail())
                    .build());
        }


        try {
            // don't forget to apply the operations now:
            ContentProviderResult[] results = context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, operationList);
            Log.d("UPDATE CONTACRT", "results=" + Arrays.toString(results));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.e("updateContactError", Objects.requireNonNull(e.getMessage()));
        }
    }

Любая помощь будет оценена здесь. Я пытался отладить, но не могу найти проблему.

1 Ответ

1 голос
/ 10 мая 2020
  1. одна проблема, которая может быть либо неправильным именем параметра, либо фактической ошибкой, заключается в том, что ваш выбор запрашивает RAW_CONTACT_ID и предоставляет параметр с именем contactId, я не уверен, что хранится в contactId, но есть большая разница между rawContactId и contactId, поэтому, если это действительно contactId, ваши операции не найдут ничего для обновления (или, что еще хуже, обновят не тот контакт).
  2. Вторая проблема заключается в том, что ваши два цикла (более userInfoMobileNos и userInfoGmails) продолжают обновлять (переопределять) одну и ту же строку данных, поэтому в конечном итоге вы должны получить только последнее значение в контактных данных. Вы также не проверяете, есть ли строка данных в контактных данных, которая соответствует вашему выбору, если ее нет, не будет строки для обновления, и поэтому код просто ничего не будет делать.
  3. Третья проблема, но это может быть намеренно, не уверен, как вы ожидаете, что ваше приложение будет работать, заключается в том, что вы предполагаете тип информационного элемента, то есть вы обновляете телефон только в том случае, если он TYPE_MOBILE, и вы обновляете только электронную почту, если это TYPE_WORK, что, если есть другие телефоны и электронные письма, сохраненные для этого контакта? ваш код просто оставит их нетронутыми, не зная, намеренно это или нет.

Чтобы исправить первую проблему, просто убедитесь, что значение в contactId равно Raw ContactId и измените название параметра. Для второй проблемы вы должны вместо этого выполнить удаление и вставку, см. Код ниже. Для третьей проблемы вам нужно изменить код выбора (paramsMobile), чтобы удалить его предположение о метке.

Предлагаемый код:

String whereMobile = Data.RAW_CONTACT_ID + " = ? AND " +
        Data.MIMETYPE + " = ? AND " +
        Phone.TYPE + " = ? ";

String[] paramsMobile = new String[]{String.valueOf(rawContactID),
        Phone.CONTENT_ITEM_TYPE,
        String.valueOf(Phone.TYPE_MOBILE)};

// First delete all the existing phones with type mobile, if any exist
operationList.add(ContentProviderOperation.newDelete(Data.CONTENT_URI)
    .withSelection(whereMobile, paramsMobile)
    .build());

// Next, insert all the updated phones:
for (UserInfo infoMobileNo : userInfoMobileNos) { // <== change the class to the one you're using in userInfoMobileNos
    operationList.add(ContentProviderOperation.newInsert(Data.CONTENT_URI) // <== insert not update!
        operationList.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) // <== insert not update!
                .withValue(Data.RAW_CONTACT_ID, rawContactID)
                .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
                .withValue(Phone.TYPE, Phone.TYPE_MOBILE)
                .withValue(Phone.NUMBER, infoMobileNo.getPhoneNumber())
                .build());
}

String whereGmail = Data.RAW_CONTACT_ID + " = ? AND " +
            Data.MIMETYPE + " = ? AND " +
            Email.TYPE + " = ? ";

String[] paramsGmail = new String[]{String.valueOf(rawContactID),
Email.CONTENT_ITEM_TYPE,
String.valueOf(Email.TYPE_WORK)};

// First delete all the existing emails with type work, if any exist
operationList.add(ContentProviderOperation.newDelete(Data.CONTENT_URI)
    .withSelection(whereGmail, paramsGmail)
    .build());

// Next, insert all the updated emails:
for (UserInfo userInfoGmail : userInfoGmails) { // <== change the class here too
    operationList.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
        .withValue(Data.RAW_CONTACT_ID, rawContactID)
                .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
                .withValue(Email.TYPE, Email.TYPE_WORK)
                .withValue(Email.DATA, userInfoGmail.getEmail())
                .build());
}

// don't forget to apply the operations now:
ContentProviderResult[] results = context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, operationList);
Log.d("UPDATE CONTACRT", "results=" + Arrays.toString(results));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...