首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在android编程中,有没有一种方法可以在CallLogs中获取更改后的联系人姓名而不是缓存的姓名?

在Android编程中,获取CallLogs中的联系人姓名时,可能会遇到显示的是缓存的姓名而不是最新的更改后的姓名的问题。这是因为Android系统为了提高性能和减少对数据库的频繁访问,会对一些数据如联系人姓名等进行缓存。

基础概念

  • CallLogs: 存储了手机的通话记录信息。
  • 联系人缓存: Android系统为了优化性能,会对联系人信息进行缓存处理。

解决方案

要获取更改后的联系人姓名而不是缓存的姓名,可以通过以下步骤实现:

  1. 查询CallLogs: 首先获取CallLogs中的通话记录。
  2. 获取联系人ID: 从CallLogs中提取联系人的ID。
  3. 查询联系人数据库: 使用联系人的ID直接查询系统的联系人数据库获取最新的联系人姓名。

以下是一个示例代码,展示了如何实现这一过程:

代码语言:txt
复制
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.provider.CallLog;
import android.provider.ContactsContract;

public String getContactNameFromCallLog(Context context, String phoneNumber) {
    String contactName = null;
    ContentResolver contentResolver = context.getContentResolver();

    // Step 1: Query CallLogs to get the contact ID
    Uri callLogUri = CallLog.Calls.CONTENT_URI;
    String[] projection = new String[]{CallLog.Calls.NUMBER, CallLog.Calls.CACHED_NAME, CallLog.Calls.CONTACT_ID};
    Cursor callLogCursor = contentResolver.query(callLogUri, projection, CallLog.Calls.NUMBER + "=?", new String[]{phoneNumber}, null);

    if (callLogCursor != null && callLogCursor.moveToFirst()) {
        String contactId = callLogCursor.getString(callLogCursor.getColumnIndex(CallLog.Calls.CONTACT_ID));

        // Step 2: Query Contacts database using the contact ID to get the latest name
        if (contactId != null) {
            Uri contactUri = ContactsContract.Contacts.CONTENT_URI;
            String selection = ContactsContract.Contacts._ID + "=?";
            Cursor contactCursor = contentResolver.query(contactUri, null, selection, new String[]{contactId}, null);

            if (contactCursor != null && contactCursor.moveToFirst()) {
                contactName = contactCursor.getString(contactCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                contactCursor.close();
            }
        }
        callLogCursor.close();
    }

    return contactName;
}

优势

  • 实时性: 直接从联系人数据库获取信息,确保显示的是最新的联系人姓名。
  • 准确性: 避免了因缓存导致的旧数据问题。

应用场景

  • 当应用程序需要显示最新的联系人信息时,如在通话记录详情页或通讯录应用中。

注意事项

  • 确保有适当的权限(如READ_CALL_LOGREAD_CONTACTS)在AndroidManifest.xml中声明,并且在运行时请求这些权限。
  • 处理可能的空值和异常情况,以增强应用的健壮性。

通过这种方式,可以有效解决在Android编程中遇到的CallLogs显示缓存联系人姓名的问题。

相关搜索:在Telethon中有没有一种方法可以从聊天中获得消息以及发送者的姓名、日期和时间?有没有一种方法可以“获取”一个属性,而不是在Xodus中“找到”它?有没有一种简单的方法可以在flutter本地缓存云firestore文档(而不是离线持久化)?有没有一种方法可以检测代码是在协作式中运行的,而不是在“经典jupyter”中运行的?有没有一种简单的方法在函数中重用代码,而不是复制代码?在OpenLayers中,有没有一种方法可以在转换后的图层中渲染Mapbox矢量分片?有没有一种方法可以在HTML中动态更改选定的表单?在mongoDB中,有没有一种方法可以在特定的时间后创建文档本身?有没有一种方法可以得到ping的结果,在文本框中显示,而不是旋转色轮?在Rails中,有没有一种方法可以让关联has_many直通join表而不是必须的?在SQL中,有没有一种方法可以在交叉连接后对列的组合进行求和?Plotly:有没有一种方法可以只更改add_trace元素中的一个而不是全部?在Google Data Studio中,有没有一种方法可以过滤我的数据,而不是在每个过滤请求之后提取数据?有没有一种简单的方法来在python中请求URL而不是遵循重定向?在Powershell中,有没有一种方法可以确保#Requires -Modules总是加载最新的更改?有没有一种方法可以在shell脚本中更改/清除for cicle循环中的变量?在Android中,有没有一种方法可以在元素居中的同时使其停留在屏幕上?在VB中,有没有一种方法可以创建当前类型的实例而不命名它?Android/XML:有没有一种方法可以在特定的地方设置图片,而不是相对的?在更大的设备上,是否可以将它们设置为适当扩展?有没有一种方法可以在点击一定次数后禁用ReactJS中的按钮?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android中ContentProvider的用法

在Android中,如果要将一个程序的数据共享给另一个程序,在之前的Android版本,我们可以设置Android文件和SharedPreferences操作的两个模式:MODE_WORLD_READABLE...首先,如果要访问一个应用程序通过ContentProvider共享的数据,一定要借助ContentResolver类,我们可以通过Context类的getContentResolver()方法获取ContentResolver...类的对象, 之后,我们就可以通过ContentResolver类提供的一些方法对数据进行 增加、更改、删除、查询 操作(和数据库的4个操作类似)。...和数据库操作不同的是,ContentResolver类的这些操作都不是通过数据库表名进行的,而是通过传入ContentProvider共享数据的Uri(统一资源标识符,通过它可以找到任何文件所处的位置)...ListView控件中,这个方法中 首先调用了ContentResolver类的query方法并且传入储存联系人信息那张数据表的Uri,用于查询联系人信息那张数据表的数据,之后对查询的返回结果Cursor

2K10

Android读取短信和联系人

短信 开始切入正题,先说短信,要从数据库中获取数据,就要了解其结构 短信数据库在data-->data中的下面路径 ?...获取联系人就比较复杂了,其表结构也比较复杂,我们获取联系人的姓名、电话号码、邮箱,要通过3张表去提取 数据库所在位置data-->data中的下面路径 ?...raw_contacts表,我们通信录中要显示的信息必须要在这里找到对应的ID,当我们删除了联系人,data表中的数据并没有删除,只是删除了证张表contact_id变为null,而不是真的删除 ?..."/> 如过是Android 6.0以上的版本还要动态获取权限 获取联系人的效果图 ?...来获取_ID和DISPLAY_NAME * _ID 该联系人的索引 * 通过这个ID可以在ContactsContract.CommonDataKinds.Phone.CONTENT_URI

2.6K30
  • android学习笔记----SQLite数据库

    /BankTransfer 官方更推荐Room而不是SQLite:https://developer.android.google.cn/training/data-storage/room 用SQLite...sqlite中是不支持删除列操作的,所以网上 alter table [table_name] drop column [col_name] 这个语句在sqlite中是无效的(这不是MySQL),而替代的方法可以如下...> 当输入数据然后点击添加的时候数据库会被创建(如果数据库还没被创建),数据会添加成功 我们可以把数据库导出到SQLite Expert去查看表内容,也可以直接在控制台查看一个大概,查看数据库和表有没有被创建...另一张contactinfo是我们在MyDBOpenHelper中创建的。 接着可以用.schema命令查看它们的建表语句。...selection:一个过滤器,声明要返回的行,格式化为SQLWHERE子句(不包括WHERE本身)。传递NULL将返回给定表的所有行。     selectionArgs:您可以在选择中包括?

    1K20

    【业界】Facebook对收集用户通话和短信数据的言论作出了回应

    在浏览Facebook存储的关于他的联系人信息时,Dylan McKay发现了一些令人不安的事情:Facebook也从他的Android手机中获得了大约两年的通话元数据,其中包括姓名、电话号码以及每次通话的时长...权限结构在版本16中的Android API中进行了更改。...但是,如果Android应用程序写入早期版本的API,则可以绕过此更改,因此Facebook API可以通过较早的Android SDK继续访问通话和SMS数据。...Facebook为用户提供了一种清除其帐户中收集的联系人数据的方式,但尚不清楚这是否会删除联系人或清除通话和SMS元数据。...虽然从技术上来说,数据收集是“可选择的”,但在这两种情况下,选择“是”是Facebook应用程序的默认安装模式,而不是单独的数据收集通知。

    1.3K70

    2-AIV--使用ContentProvider查询联系人

    零、前言 [1].顾名思义,内容提供者,目的:实现跨进程间数据共享 [2].基于数据库提供数据 [3].如电话簿,短信,歌曲信息都是以数据库存储存储,都可以通过ContentProvider获取...[4].不太熟悉安卓运行时权限的童鞋可以看一下我封装的权限申请类: TI--安卓运行时权限完美封装 [5].如果只是想使用的人,直接把静态方法拷贝即可,想知道原理的,图片和注释认真看一下,也可以自己分析一下联系人的表...ContactBean { /** * 联系人姓名 */ public String name; /** * 联系人地址 */.../** * 获取联系人:ContactBean字段:name姓名 address地址 email邮箱 phone手机号 * * @param ctx 上下文...:这个比较耗时,要不要酌情处理,所以封装个方法,没有直接写在上面的方法中 /** * 根据号码获得联系人头像 * * @param ctx 上下文

    54010

    ContentProvider初探

    1.我们想在自己的应用中访问别的应用,或者说一些ContentProvider暴露给我们的一些数据, 比如手机联系人,短信等!...这里给出如何获取URL与对应的数据库表的字段, 这里以最常用的联系人为例,其他自行google~ ①来到系统源码文件下:all-src.rar -> TeleponeProvider -> AndroidManifest.xml...; resolver.insert(uri, conValues); } 注意事项: 上述代码在4.4以下都可以实现写入短信的功能,而5.0上就无法写入,原因是: 从5.0开始,默认短信应用外的软件不能以写入短信数据库的形式发短信...cursor = resolver.query(uri, null, null, null, null); while(cursor.moveToNext()) { //获取联系人姓名...使用指南: 运行程序后,晾一边,收到短信后,可以在logcat上看到该条信息的内容,可以根据自己的需求 将Activtiy改做Service,而在后台做这种事情~ 小结 关于ContentProvider

    53530

    Android ContentProvider之联系人数据库及操作

    具体哪些独立的数据可以占一行,可以在mimetypes这张表中找到, 原生Android的系统 一共12种,例如name,phone,email ect.....大部分情况下这两层的数据时指同一个联系人的信息,即他们俩是一一对应的关系,但是有些特殊 情况,这个我是查了一些老外的论坛加上自己的理解,例如 我做一个本地通信录和网络上的通信录同步的时候,可能有一个人他在本地存在...“mimetype”是电话 或者 姓名 的标示符编码: 例如:电话 对应“vnd.android.cursor.item/phone_v2” 姓名 对应“vnd.android.cursor.item/...Ø 联系人的所有信息保存在列data1至data15中,各列中保存的内容根据MimeTypeID的不同而不同。...=null && cursor.getCount() > 0){ //从cursor中取出我们需要的联系人姓名和电话 while(cursor.moveToNext()){

    97910

    Android系统联系人全特效实现(上),分组导航和挤压动画

    记得在我刚接触Android的时候对系统联系人中的特效很感兴趣,它会根据手机中联系人姓氏的首字母进行分组,并在界面的最顶端始终显示一个当前的分组。...如下图所示: 最让我感兴趣的是,当后一个分组和前一个分组相碰时,会产生一个上顶的挤压动画。那个时候我思考了各种方法想去实现这种特效,可是限于功夫不到家,都未能成功。...,在onCreate方法中,我们从系统联系人数据库中去查询联系人的姓名和排序键,之后将查询返回的cursor直接传入AlphabetIndexer作为第一个参数。...然后我们在setupContactsListView方法中监听了ListView的滚动,在onScroll方法中通过getSectionForPosition方法获取第一个可见元素的分组值,然后给该分组值加...之后再通过ListView的getChildAt(0)方法,获取到界面上显示的第一个子View,再用view.getBottom获取底部距离父窗口的位置,对比分组布局的高度来对顶部分组布局进行纵向偏移,

    1.2K50

    保存联系人到系统通讯录

    对应着读联系人,把数据写进去,市场上的社交类应用经常会有这样的功能 向raw_contacts表中添加一个id 向data表里面添加对应的数据 获取ContentResolver对象,通过getContentResolver...()方法 调用ContentResolver对象的query()方法,查询raw_contacts表,得到Cursor对象 调用Cursor对象的moveToLast()方法,游标移动到最后一行 获取到最后一行记录的...contact_id,新的id就是它加上1 调用ContentResolver对象的insert(uri,values)方法,参数:values是ContentValues对象把新的id put()进去...获取到ContentResolver对象后调用insert(uri,values)方法,参数:Uri应该是data表的Uri规则,ContentValues对象的,put(key,value),”raw_contact_id...”=>上面的id,”mimetype”=>”vnd.android.cursor.item/phone_v2”,”data1”=>”电话号码” 然后添加姓名,和上面一样只不过在ContentValues

    82330

    数据结构项目实战——通讯录

    接下来,函数会根据用户提供的唯一标识符(如联系人ID或姓名)在通讯录数据库中查找对应的联系人记录。如果找不到匹配的记录,函数会返回错误信息,告知用户联系人不存在。...这些数据可以存储在文件、数据库或内存中,而打印函数则需要从这些源中读取数据,并将其转换为适合展示的格式。 其次,打印函数还需要考虑如何呈现联系人信息。...,它负责将处理后的数据以安全、有效的方式存储在计算机系统的硬盘或其他持久化存储介质中。...通过使用枚举函数,我们可以清楚地定义这些数据的取值范围,并在代码中对每一种取值进行相应的处理,从而有效地避免这类错误的发生。 当然,枚举函数并不是万能的。...在这种情况下,可能需要考虑使用其他的数据结构或方法来进行处理。 总的来说,枚举函数是一种非常有用的编程工具,它可以帮助我们更好地处理和管理具有固定、有限且明确值集合的数据类型。

    21610

    业界 | 谷歌版“剑桥分析事件”上演,华尔街日报发文谴责,谷歌长文回应

    果然,谷歌在“华尔街日报”报道发布几分钟后,宣布了其Strobe项目安全审计结果。具体包括包括阻止一些第三方访问Android手机短信数据、通话记录以及一些联系方式。...我们认为,这个错误产生的原因在于API与随后Google+代码更改后产生的相互作用。 我们在设置Google+时考虑到了隐私权,因此将此API的日志数据保留了两周。...展望未来,消费者将对他们选择与应用分享的帐户数据进行更细致入微的控制。应用程序必须在其对话框中一次一个地显示各个请求的权限,而不是在单个屏幕中查看所有请求的权限。...例如,如果开发人员请求访问日历条目和驱动器文档,您将能够选择共享其中的一项而不是其他的。...此外,作为 Android 联系人(Android Contacts)权限机制的一部分,我们此前提供了基本的交互访问数据功能 —— 比如,一个短信应用可以获取并显示最近的联系人记录。

    1.1K50

    【腾讯云 Cloud Studio 实战训练营】基于Cloud Studio完成简易通讯录

    用户在使用 Cloud Studio 时无需安装,随时随地打开浏览器就能在线编程。...图片 完成后我们就可以通过链接的方式,将自己的代码分享给别人啦,这样对方就可以接着已经编好的程序继续编写啦,相当的方便。 综上,就是Cloud Studio基本的操作步骤啦!...3.8 将联系人排序 这部分将排序后的信息并没有写入文件,但是可以通过选择保存联系人后,将排序好的信息写入文件中。...代码实现的基本思路是定义一个通讯录类,然后通过列表进行增删改查和排序等操作,并且可以将通讯录内容保存到文件中。 在代码实现上,对于用户输入的数据进行了简单的校验,保证了数据的有效性和安全性。...今天我受到一个大佬的启发,我完全可以在平板上编辑程序呀,省着拿着电脑了,原来在平板上用的是python编辑器(是一个软件),体验并不是很好,只要一切换软件,程序就停止运行(已经允许它后台了)。

    42920

    Android查缺补漏--ContentProvider的使用

    ContentProvider (内容提供者)是一种共享型组件,可以为系统内应用于与应用之间提供访问接口。...ContentResolver 比如,当应用A想把自己数据暴露出来让别的应用也可以操作的话,就可以在应用A内部创建一个ContentProvider实现相关方法并添加URI,然后在其他应用中(应用B)就可以通过...1、查询系统联系人 通过系统联系人的Uri获取系统联系人及手机号码: public void query() { showContact = ""; // 获取联系人的Cursor集合...values); Toast.makeText(getApplicationContext(), "添加成功", Toast.LENGTH_LONG).show(); query(); } 在输入框中输入联系人姓名...最后想说的是,本系列文章为博主对Android知识进行再次梳理,查缺补漏的学习过程,一方面是对自己遗忘的东西加以复习重新掌握,另一方面相信在重新学习的过程中定会有巨大的新收获,如果你也有跟我同样的想法,

    75000

    手把手教你用C语言实现通讯录管理系统

    一、引言 在日常生活中,我们经常需要管理大量的联系人信息,如姓名、性别、年龄、电话和地址等。为了方便地管理和查询这些信息,我们可以使用C语言编写一个通讯录管理系统。本文将带领大家一步步实现这个系统。...查询联系人:根据用户输入的联系人姓名,查询对应的联系人信息。 显示联系人:显示所有已添加的联系人信息。 加载数据:在程序启动时,系统需要从指定的文件中读取联系人数据,并恢复通讯录的状态。...删除联系人 提示用户输入要删除联系人的姓名。 在通讯录文件中查找对应的联系人。 如果找到,删除该联系人的信息,并提示用户删除成功。 如果未找到,提示用户联系人不存在。...查询联系人 提示用户输入要查询联系人的姓名。 在通讯录中查找对应的联系人。 如果找到,显示该联系人的详细信息。 如果未找到,提示用户联系人不存在。...通过学习本文,读者可以掌握C语言编程的基本技巧,为以后的项目开发奠定基础。当然,这个通讯录管理系统还有许多可以优化的地方,比如增加联系人信息的排序、分页显示等功能,感兴趣的读者可以继续完善。

    19310

    C语言实现简易手机通讯录,自学C语言小项目!

    wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1] 一、通讯录 通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、电话。...选择在0-7范围内时,使用转移表调用函数。...void init(AddressBook* addressbook) { addressbook->size = 0; } 123 六、新增联系人 首先,判断通讯录是不是满了,满了给出提示,没满让用户输入联系人姓名和电话...\n"); addressbook->size++; } 123456789101112131415 七、查找联系人 采用按照姓名查找电话号码的方法。用户输入姓名后查找,输出编号、姓名和电话。...\n"); } 123456789101112131415161718 九、修改联系人 用户输入联系人的编号来进行修改,更改下标为 id 的元素。用户重新输入姓名和电话,输出更新成功。

    1.7K2218

    android经常使用的电话操作

    给大家分享一下我的一个Android工具类,能够获取手机里面的各种信息,包含拨打电话。 获取全部联系人姓名及电话,插入联系人姓名及电话,插入联系人姓名及电话。插入通话记录。获取用户全部短信。...Intent.ACTION_CALL); intent.setData(Uri.parse("tel:" + number)); context.startActivity(intent); } /* * 获取全部联系人姓名及电话..._ID)); // 获取联系人的ID号,在SQLite中的数据库ID Cursor phone = cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI...return; ContentResolver cr = context.getContentResolver(); // 首先向RawContacts.CONTENT_URI运行一个空值插入,目的是获取系统返回的...RawContacts.ACCOUNT_TYPE, null) .withValue(RawContacts.ACCOUNT_NAME, null).build()); // 插入当前编号人的姓名

    56510

    C语言数据结构 ---- 单链表实现通讯录

    今日备忘录: "折磨我们的往往是想象, 而不是现实." 正文开始 1....前言 顺表实现通讯录: 点击~ 顺序表实现通讯录 在日常生活中,我们经常需要记录和管理大量的联系人信息,比如朋友的电话号码、家庭成员的生日等等。...而通讯录就是一种常见的方式,用于存储和组织这些联系人信息。 通讯录可以采用不同的数据结构来实现,前面我使用了顺序表创建, 单链表是一种常用且简单的数据结构之一。...数据域用于存储联系人的信息,指针域用于指向下一个节点。 在这篇文章中,我们将使用单链表来实现一个简单的通讯录。我们将定义联系人的结构体,包含姓名、电话号码等信息,并使用单链表来管理这些联系人。...因为头文件不可以嵌套包含, 这样会使程序代码冗余, 在单链表的头文件包含了通讯录的头文件, 就不要在让通讯录的头文件包含单链表了, 单链表中需要使用到通讯录的结构定义, 如下所示: SList.h 需要更改存储数据类型为通讯录

    7610

    【数据结构】顺序表实操——通讯录项目

    在通讯录中以一个联系人为单位,存储着若干个联系人的各种信息,我们也可以对通讯录中的联系人信息进行相应的增删查改操作。...首先我们需要获取要删除的这个联系人的信息,然后在通讯录中查找,如果找到了就可以执行删除操作,如果没找到就不能进行删除操作。...这个方法我们以前使用过多次了,这里就不再赘述。 其中枚举类型定义在头文件contact.h中。...上面操作的数据是保存在内存中的,而当程序运行结束后,内存会回收,那我们所操作的数据就消失了,为了我们所操作的通讯录数据可以保存下来,这里需要用到文件来实现。...,而本文的顺序表存储的结构体类型数据而已 在本篇文章中我们更多的是对保存联系人信息的结构体类型进行相应的操作,通讯录实际上就是顺序表,而顺序表的相关操作是我们已经实现好了的,所以我们只需要拿来用就可以了

    10710
    领券