12

我能够以编程方式在 Android 通话记录中插入一个带有数字、日期、持续时间和类型的条目,但我不知道如何还包括照片、标签和名称?我要添加的条目是用于具有完全相同号码的现有联系人。我注意到在摩托罗拉设备上,如果号码与现有联系人匹配,则会出现名称和图片,但在我的 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);
4

2 回答 2

2

您不能将照片插入通话记录本身;这些存储在与通话记录条目链接的联系人中。有关如何执行此操作的更多信息,请参阅ContactsContract.Data 。

至于 HTC 设备不使用现有照片更新通话记录,这可能与 HTC Sense 缓存通话记录条目的方式有关;我见过类似的问题只出现在 Sense 设备上。

通话记录条目通常存储在calls联系人应用程序数据库 ( /data/data/com.android.providers.contacts/databases/contacts2.db) 的表中。出于某种原因,如果联系人数据发生更改,HTC Sense 似乎不会更新现有的通话记录条目,但其他 ROM 会。

例如,如果我使用带有股票 Sense 5.0 的 HTC EVO LTE 向我保存为“Jenny Smith”的人拨打电话,则会在calls表中创建一个条目,其中包含一个name字段——其中存储了 Jenny Smith。如果我将她的联系信息更新为“Jenny Jones”并向她发出新呼叫,则会在calls表中存储一个名为 Jenny Jones 的新条目,但之前的条目不会更改。实际的呼叫历史屏幕将所有呼叫显示为 Jenny Jones,但数据库本身具有旧名称。

calls当查看通话记录时,我测试过的其他设备(包括 Nexus 5)会更新表格中的先前条目。您的摩托罗拉设备可能像 Nexus 5 一样,根据需要刷新数据。

我不是数据库向导,但对它们有一定程度的熟悉。从数据库结构的角度来看,对我来说,任何特定于联系人的信息都存储在该表中似乎很奇怪calls(它包含一个链接到存储所有实际联系人信息的数据库表中raw_contacts_id的同一字段的字段) contacts,但这就是它的实现方式。

于 2014-02-28T21:39:43.193 回答
1

唯一合理的方法(无论如何对我都有效)是将联系人直接添加到手机,然后添加指向该联系人的通话记录,然后您可以从手机中删除联系人。唯一的问题是如果您的应用在删除联系人之前被杀死,那么您将不得不在下一次应用启动时实施某种清理。对于应该是一个简单的任务来说,这一切都非常混乱。

于 2014-03-03T09:22:41.860 回答