详见在Android 2.2源码 packages/apps/Phone/tests/src/com/android/phone/NotificationMgr.java 模块中异步查询机制:
(1)开始查询
// instantiate query handler
mQueryHandler = new QueryHandler(mContext.getContentResolver());
// setup query spec, look for all Missed calls that are new.
StringBuilder where = new StringBuilder("type=");
where.append(Calls.MISSED_TYPE);
where.append(" AND new=1");
// start the query
mQueryHandler.startQuery(CALL_LOG_TOKEN, null, Calls.CONTENT_URI, CALL_LOG_PROJECTION,
where.toString(), null, Calls.DEFAULT_SORT_ORDER);
(2)异步查询类
/**
* Class used to run asynchronous queries to re-populate
* the notifications we care about.
*/
private class QueryHandler extends AsyncQueryHandler {
/**
* Used to store relevant fields for the Missed Call
* notifications.
*/
private class NotificationInfo { //Modle
public String name;
public String number;
public String label;
public long date;
public int subscription;
}
public QueryHandler(ContentResolver cr) {
super(cr);
}
/**
* Handles the query results. There are really 2 steps to this,
* similar to what happens in RecentCallsListActivity.
* 1. Find the list of missed calls
* 2. For each call, run a query to retrieve the caller's name.
*/
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
// TODO: it would be faster to use a join here, but for the purposes
// of this small record set, it should be ok.
// Note that CursorJoiner is not useable here because the number
// comparisons are not strictly equals; the comparisons happen in
// the SQL function PHONE_NUMBERS_EQUAL, which is not available for
// the CursorJoiner.
// Executing our own query is also feasible (with a join), but that
// will require some work (possibly destabilizing) in Contacts
// Provider.
// At this point, we will execute subqueries on each row just as
// RecentCallsListActivity.java does.
switch (token) {
case CALL_LOG_TOKEN:
if (DBG) log("call log query complete.");
// initial call to retrieve the call list.
if (cursor != null) {
while (cursor.moveToNext()) {
// for each call in the call log list, create
// the notification object and query contacts
NotificationInfo n = getNotificationInfo (cursor);
if (DBG) log("query contacts for number: " + n.number); //从号码中查询联系人
mQueryHandler.startQuery(CONTACT_TOKEN, n,
Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, n.number),
PHONES_PROJECTION, null, null, PhoneLookup.NUMBER);
}
if (DBG) log("closing call log cursor.");
cursor.close();
}
break;
case CONTACT_TOKEN:
if (DBG) log("contact query complete.");
// subqueries to get the caller name.
if ((cursor != null) && (cookie != null)){
NotificationInfo n = (NotificationInfo) cookie;
if (cursor.moveToFirst()) {
// we have contacts data, get the name.
if (DBG) log("contact :" + n.name + " found for phone: " + n.number);
n.name = cursor.getString(
cursor.getColumnIndexOrThrow(PhoneLookup.DISPLAY_NAME));
}
// send the notification
if (DBG) log("sending notification.");
if (TelephonyManager.isDsdsEnabled()) {
notifyMissedCall(n.name, n.number, n.label, n.date, n.subscription);
} else {
notifyMissedCall(n.name, n.number, n.label, n.date);
}
if (DBG) log("closing contact cursor.");
cursor.close();
}
break;
default:
}
}
/**
* Factory method to generate a NotificationInfo object given a
* cursor from the call log table.
*/
private final NotificationInfo getNotificationInfo(Cursor cursor) {
NotificationInfo n = new NotificationInfo();
n.name = null;
n.number = cursor.getString(cursor.getColumnIndexOrThrow(Calls.NUMBER));
n.label = cursor.getString(cursor.getColumnIndexOrThrow(Calls.TYPE));
n.date = cursor.getLong(cursor.getColumnIndexOrThrow(Calls.DATE));
// make sure we update the number depending upon saved values in
// CallLog.addCall(). If either special values for unknown or
// private number are detected, we need to hand off the message
// to the missed call notification.
if ( (n.number.equals(CallerInfo.UNKNOWN_NUMBER)) ||
(n.number.equals(CallerInfo.PRIVATE_NUMBER)) ||
(n.number.equals(CallerInfo.PAYPHONE_NUMBER)) ) {
n.number = null;
}
if (DBG) log("NotificationInfo constructed for number: " + n.number);
return n;
}
}
分享到:
相关推荐
在Android操作系统中,管理联系人是一项重要的任务,尤其是在用户导入大量数据或同步不同来源的联系人时,可能会出现重复的联系人条目。为了解决这个问题,我们可以开发一个"android合并重复联系人功能",这将极大地...
这个项目,"基于android studio的读取联系人并可点击拨打电话",显然是一个教学或示例项目,它借鉴了郭霖的畅销书《第一行代码》中的方法。下面将详细讲解如何实现这一功能。 首先,我们需要了解Android的权限管理...
_design的电话簿主要是在Android手机上实现新建、删除、编辑、打电话、联系人模糊查找等功能。_ Android操作系统的特点: * 基于Linux的开源码操作系统 * 主要用于便携设备 * 兼容多种设备,包括手机、平板电脑、...
在Android平台上,联系人管理是应用开发中常见且重要...通过这个例子,初学者可以快速掌握Android联系人管理的基本操作,并在此基础上进行更复杂的定制和扩展。记得在实际开发中遵循最佳实践,保证用户体验和数据安全。
本文将深入探讨如何解决在Android中查询和处理联系人姓名重复时遇到的问题,以及如何实现自动提示功能,使得用户能够更方便地添加和查询联系人的多个电话号码。 首先,我们需要理解Android中的联系人存储机制。...
在AndroidManifest.xml文件中,必须添加读取联系人数据的权限声明,这是由于Android系统的隐私保护机制。相应的权限声明如下: ```xml <uses-permission android:name="android.permission.READ_CONTACTS" /> ``...
在Android应用开发中,"Android-Android联系人选择器"是一个常见的需求,它允许用户从他们的设备联系人列表中选择一个或多个联系人。这个功能广泛应用于消息发送、邀请发送等场景,提升用户体验并简化操作流程。在这...
在Android平台上,联系人模块是应用开发中的一个重要组成部分,它允许用户管理他们的个人联系信息,如姓名、电话号码、电子邮件地址等。对于初学者来说,理解并实现这一功能可以帮助他们更好地掌握Android应用开发的...
在这个ViewHolder中,我们通常会有TextView用于显示联系人姓名,另一个TextView用于显示电话号码。当适配器的onCreateViewHolder方法被调用时,会实例化ViewHolder,而在onBindViewHolder方法中,我们将从查询结果中...
在Android平台上,与系统通讯录交互是常见的功能需求,它涉及到用户可以查看、选择联系人以及拨打电话。本文将详细讲解如何实现这些功能,并提供相关的编程知识点。 **一、Android调用系统通讯录** Android提供了...
ContactsContract类包含了所有与联系人相关的常量和类,它是访问Android联系人数据的核心。 例如,以下代码展示了如何使用ContentResolver查询联系人: ```java ContentResolver resolver = getContentResolver(); ...
在Android系统中,联系人信息的存储与管理是通过内置的联系人数据库完成的...上述内容对于接触Android联系人开发的程序员来说,是必须要掌握的基础知识点,其能帮助开发者更好地管理和操作Android系统中的联系人数据。
在Android开发中,联系人列表查询、选择和搜索是常见的功能需求,特别是在构建社交或通讯类应用时。这里我们将深入探讨这些知识点,并结合"ContactList-master"这个项目,来了解如何实现这一系列功能。 首先,...
5. **处理数据**:在遍历过程中,可以通过getString()方法获取指定列的值,如获取联系人的名字和电话号码。 **发送短信** 发送短信涉及到使用SmsManager类。以下是如何发送短信的基本步骤: 1. **请求权限**:...
在Android系统中,获取联系人信息是常见的功能需求,尤其对于社交类或通讯类应用来说,这是一项必不可少的功能。为了实现这一目标,开发者需要理解Android的权限管理、ContentResolver和ContactsContract类。以下是...
在Android应用开发中,访问和显示本地联系人是常见的需求,比如在社交应用或者通讯录类应用中。本文将详细讲解如何实现加载本地联系人到应用程序,并展示一个基本的UI设计示例。 首先,我们需要创建一个布局文件来...
在Android系统中,动态添加联系人是一项常见的功能,它允许应用程序在运行时向用户的设备通讯录插入新的联系人信息。这个过程涉及到Android的Content Provider机制,权限管理,以及使用ContentResolver进行数据操作...
在Android系统中,读取手机联系人是一项常见的功能,它涉及到Android的核心组件——ContentProvider。ContentProvider是Android四大组件之一,用于在不同的应用程序之间共享数据。在这个场景下,我们将主要探讨如何...
在Android系统中,获取本机号码、联系人信息以及拨打电话是常见的功能需求,尤其是在开发与通讯相关的应用程序时。在Android 2.2(API级别8)版本中,这些功能的实现有一些特定的注意事项和权限要求。下面我们将详细...
在Android系统中,访问和管理通讯录是常见的功能需求,涉及到Android框架中对联系人数据的API使用。本文将深入探讨如何在Android应用中实现访问通讯录中的联系人以及添加新联系人的步骤。 首先,我们需要了解...