### 在系统联系人头像改变后桌面联系人小部件图标同步更新 #### 概述 在移动设备上,用户经常需要快速访问特定联系人的信息,为此很多设备提供了桌面联系人小部件的功能。当用户更改了某个联系人的头像时,为了保持数据的一致性和用户体验的流畅性,桌面联系人小部件上的头像也需要及时更新。本文将详细介绍如何实现这一功能,包括事件触发机制、广播接收器的设置以及具体的图像更新逻辑。 #### 关键知识点解析 ##### 1. 事件触发机制:`doNotifyLauncher()` **定义**:这是一个用于通知桌面联系人小部件的方法,当检测到联系人头像发生变化时会被调用。 **参数**: - `mLookup`: 用于标识特定联系人的字符串。 - `rawContactId`: 原始联系人ID,用于更精确地定位需要更新的联系人信息。 **核心代码解析**: ```java private void doNotifyLauncher(String mLookup, long rawContactId) { Intent intent = new Intent(); intent.setAction(CONTACT_PHOTO_CHANGED_ACTION); intent.putExtra("mLookupUri", mLookup); intent.putExtra("rawContactId", rawContactId); mContext.sendBroadcast(intent); } ``` - **ACTION**: `CONTACT_PHOTO_CHANGED_ACTION` 是一个自定义的广播动作,用于标记联系人头像发生了变化。 - **Extra 参数**:通过 `putExtra()` 方法传递额外的数据,这里传递了 `mLookup` 和 `rawContactId` 两个参数,以便接收方能够识别是哪个联系人发生了变化。 **作用**:该方法负责发送广播,通知桌面联系人小部件联系人头像已更新,从而触发小部件进行相应的处理。 --- ##### 2. 广播接收器:`BroadcastReceiver` **定义**:这是一个专门用于接收并处理 `CONTACT_PHOTO_CHANGED_ACTION` 广播的广播接收器。 **核心代码解析**: ```java private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (CONTACT_PHOTO_CHANGED_ACTION.equals(action)) { try { Thread.sleep(1000); // 等待1秒以确保数据已经更新 updateContactsPhoto(intent.getLongExtra("rawContactId", 0)); } catch (InterruptedException e) { e.printStackTrace(); } } } }; ``` - **处理逻辑**:当接收到 `CONTACT_PHOTO_CHANGED_ACTION` 广播时,会调用 `updateContactsPhoto()` 方法来更新联系人头像。 - **延迟执行**:为了避免数据尚未完全更新就立即刷新的情况,这里加入了1秒的延迟。 **作用**:负责监听 `CONTACT_PHOTO_CHANGED_ACTION` 广播,并根据接收到的信息调用 `updateContactsPhoto()` 方法更新桌面联系人小部件的头像。 --- ##### 3. 图像更新逻辑:`updateContactsPhoto()` **定义**:这是用于更新联系人头像的核心方法。 **核心代码解析**: ```java private void updateContactsPhoto(long rawcontactId) { long raw_contact_id = 0; byte[] photoData = null; Uri uri = ContactsContract.Data.CONTENT_URI; Cursor cursor = getContentResolver().query( uri, new String[] { ContactsContract.RawContacts.Data.RAW_CONTACT_ID, ContactsContract.Data.DATA15 }, null, null, null); if (cursor == null) { return; } int ncontactIndex = cursor.getColumnIndex(ContactsContract.RawContacts.Data.RAW_CONTACT_ID); int nData15Index = cursor.getColumnIndex(ContactsContract.Data.DATA15); cursor.moveToFirst(); do { raw_contact_id = cursor.getLong(ncontactIndex); photoData = cursor.getBlob(nData15Index); if (raw_contact_id == rawcontactId && photoData != null) { InputStream inputStream = new ByteArrayInputStream(photoData); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); mImageView.setImageBitmap(bitmap); } } while (cursor.moveToNext()); } ``` - **数据查询**:通过 `getContentResolver().query()` 方法从 `ContactsContract.Data.CONTENT_URI` 查询与指定 `rawContactId` 相关的联系人头像数据。 - **数据处理**:从查询结果中提取联系人头像数据,并将其转换为 `Bitmap` 对象显示在 `mImageView` 中。 **作用**:根据提供的 `rawContactId` 更新桌面联系人小部件中的头像,确保其与系统中存储的最新头像一致。 ### 总结 通过以上三个关键步骤的实现,可以确保在系统联系人头像发生更改时,桌面联系人小部件上的头像也能够同步更新,从而提升用户的使用体验。这种机制不仅适用于桌面联系人小部件,也可以应用于其他需要实时更新联系人信息的应用场景中。
联系人代码中发出的广播:
private void doNotifyLauncher(String mLookup,long rawContactId) {
Intent intent = new Intent();
intent.setAction(CONTACT_PHOTO_CHANGED_ACTION);
intent.putExtra("mLookupUri",mLookup);
intent.putExtra("rawContactId",rawContactId);
mContext.sendBroadcast(intent);
}
测试的第三方广播接收器:
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (CONTACT_PHOTO_CHANGED_ACTION.equals(action)) {
try {
Thread.sleep(1000);
updateContactsPhoto(intent.getLongExtra("rawContactId", 0));;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
- 粉丝: 1
- 资源: 7
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于SSM框架的大学消息通知系统服务端.zip
- (源码)基于Java Servlet的学生信息管理系统.zip
- (源码)基于Qt和AVR的FestosMechatronics系统终端.zip
- (源码)基于Java的DVD管理系统.zip
- (源码)基于Java RMI的共享白板系统.zip
- (源码)基于Spring Boot和WebSocket的毕业设计选题系统.zip
- (源码)基于C++的机器人与船舶管理系统.zip
- (源码)基于WPF和Entity Framework Core的智能货架管理系统.zip
- SAP Note 532932 FAQ Valuation logic with active material ledger
- (源码)基于Spring Boot和Redis的秒杀系统.zip