Подтвердить что ты не робот

Как программно вставлять записи журнала вызовов с отображаемым именем и фотографией?

Я могу программно вставить запись в журнал вызовов Android с номером, датой, продолжительностью и типом, но я не могу понять, как включить фотографию, ярлык и имя? Запись, которую я добавляю, касается существующего контакта с таким же номером. Я заметил, что на устройстве Motorola имя и pic отображаются, если число соответствует существующему контакту, но на моем HTC Incredible что-то не хватает?

Я делаю следующее.. (не знал, что даже попробовать для фото)

ContentValues values = new ContentValues();
values.put(CallLog.Calls.NUMBER, number);
values.put(CallLog.Calls.CACHED_NAME, name);
values.put(CallLog.Calls.CACHED_NUMBER_LABEL, label);
values.put(CallLog.Calls.DATE, date);
values.put(CallLog.Calls.DURATION, duration);
values.put(CallLog.Calls.TYPE, myCallType);
context.getContentResolver().insert(CallLog.Calls.CONTENT_URI, values);
4b9b3361

Ответ 1

Вы не можете вставлять фотографии в журнал вызовов; они сохраняются в контакте, который связан с записью журнала вызовов. См. ContactsContract.Data для получения дополнительной информации о том, как это сделать.

Поскольку устройство HTC не обновляет журнал вызовов с существующей фотографией, его можно связать с тем, как HTC Sense кэширует записи журнала вызовов; Я видел похожие проблемы, которые появляются только на устройствах Sense.

Записи журнала вызовов обычно хранятся в таблице calls в базе данных приложений контактов (/data/data/com.android.providers.contacts/databases/contacts2.db). По какой-то причине кажется, что HTC Sense не обновляет существующие записи журнала вызовов, если контактные данные меняются, но другие ПЗУ делают.

Например, если я использую HTC EVO LTE с запасом Sense 5.0, чтобы позвонить кому-то, кого я сохранил как "Дженни Смит", запись создается в таблице calls, которая включает в себя поле name - где хранит Дженни Смит. Если я обновляю свою контактную информацию до "Jenny Jones" и добавлю новый вызов, новая запись будет сохранена в таблице calls с именем Jenny Jones, но предыдущая запись не будет изменена. На экране фактической истории вызовов отображаются все вызовы как Jenny Jones, но сама база данных имеет старое имя.

Другие устройства, которые я тестировал (включая Nexus 5), обновляют предыдущие записи в таблице calls при просмотре журнала вызовов. Ваше устройство Motorola, вероятно, ведет себя как Nexus 5, обновляя данные по мере необходимости.

Я не мастер базы данных, но имею достаточное количество знакомых с ними. С точки зрения структуры базы данных мне кажется странным, что любая контактная информация хранится в этой таблице calls (она содержит поле raw_contacts_id, которое связано с тем же поле в таблице contacts этой базы данных, где вся фактическая контактная информация сохраняется), но это то, как она реализована.

Ответ 2

Единственный разумный способ сделать это (что работает для меня в любом случае) - это добавить контакт непосредственно к телефонной трубке, а затем добавить свой журнал вызовов, указывающий на этот контакт, после чего вы можете удалить контакт с телефонной трубки. Единственная проблема заключается в том, что ваше приложение убивается перед удалением контакта, поэтому вам нужно будет выполнить некоторую очистку при следующем запуске приложения. Все это очень грязно для того, что должно быть простой задачей.