`

在Android中根据联系人查询电话号码

阅读更多


详见在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合并重复联系人功能",这将极大地...

    基于android studio的读取联系人并可点击拨打电话

    这个项目,"基于android studio的读取联系人并可点击拨打电话",显然是一个教学或示例项目,它借鉴了郭霖的畅销书《第一行代码》中的方法。下面将详细讲解如何实现这一功能。 首先,我们需要了解Android的权限管理...

    Android电话号码簿Sqlite

    _design的电话簿主要是在Android手机上实现新建、删除、编辑、打电话、联系人模糊查找等功能。_ Android操作系统的特点: * 基于Linux的开源码操作系统 * 主要用于便携设备 * 兼容多种设备,包括手机、平板电脑、...

    android 联系人模块例子

    在Android平台上,联系人管理是应用开发中常见且重要...通过这个例子,初学者可以快速掌握Android联系人管理的基本操作,并在此基础上进行更复杂的定制和扩展。记得在实际开发中遵循最佳实践,保证用户体验和数据安全。

    Android通讯录联系人查询,自动提示,一个人多个号码

    本文将深入探讨如何解决在Android中查询和处理联系人姓名重复时遇到的问题,以及如何实现自动提示功能,使得用户能够更方便地添加和查询联系人的多个电话号码。 首先,我们需要理解Android中的联系人存储机制。...

    android读取系统联系人

    在AndroidManifest.xml文件中,必须添加读取联系人数据的权限声明,这是由于Android系统的隐私保护机制。相应的权限声明如下: ```xml <uses-permission android:name="android.permission.READ_CONTACTS" /> ``...

    Android-Android联系人选择器

    在Android应用开发中,"Android-Android联系人选择器"是一个常见的需求,它允许用户从他们的设备联系人列表中选择一个或多个联系人。这个功能广泛应用于消息发送、邀请发送等场景,提升用户体验并简化操作流程。在这...

    android 联系人模块

    在Android平台上,联系人模块是应用开发中的一个重要组成部分,它允许用户管理他们的个人联系信息,如姓名、电话号码、电子邮件地址等。对于初学者来说,理解并实现这一功能可以帮助他们更好地掌握Android应用开发的...

    Android 联系人列表

    在这个ViewHolder中,我们通常会有TextView用于显示联系人姓名,另一个TextView用于显示电话号码。当适配器的onCreateViewHolder方法被调用时,会实例化ViewHolder,而在onBindViewHolder方法中,我们将从查询结果中...

    Android调用系统通讯录,选择联系人,拨打电话

    在Android平台上,与系统通讯录交互是常见的功能需求,它涉及到用户可以查看、选择联系人以及拨打电话。本文将详细讲解如何实现这些功能,并提供相关的编程知识点。 **一、Android调用系统通讯录** Android提供了...

    Android仿手机查询读取联系人

    ContactsContract类包含了所有与联系人相关的常量和类,它是访问Android联系人数据的核心。 例如,以下代码展示了如何使用ContentResolver查询联系人: ```java ContentResolver resolver = getContentResolver(); ...

    android 联系人总结

    在Android系统中,联系人信息的存储与管理是通过内置的联系人数据库完成的...上述内容对于接触Android联系人开发的程序员来说,是必须要掌握的基础知识点,其能帮助开发者更好地管理和操作Android系统中的联系人数据。

    Android-联系人列表查询选择搜索

    在Android开发中,联系人列表查询、选择和搜索是常见的功能需求,特别是在构建社交或通讯类应用时。这里我们将深入探讨这些知识点,并结合"ContactList-master"这个项目,来了解如何实现这一系列功能。 首先,...

    Android 获取系统联系人并发送短信demo

    5. **处理数据**:在遍历过程中,可以通过getString()方法获取指定列的值,如获取联系人的名字和电话号码。 **发送短信** 发送短信涉及到使用SmsManager类。以下是如何发送短信的基本步骤: 1. **请求权限**:...

    Android获取联系人

    在Android系统中,获取联系人信息是常见的功能需求,尤其对于社交类或通讯类应用来说,这是一项必不可少的功能。为了实现这一目标,开发者需要理解Android的权限管理、ContentResolver和ContactsContract类。以下是...

    android 加载本地联系人实现方法

    在Android应用开发中,访问和显示本地联系人是常见的需求,比如在社交应用或者通讯录类应用中。本文将详细讲解如何实现加载本地联系人到应用程序,并展示一个基本的UI设计示例。 首先,我们需要创建一个布局文件来...

    Android 动态添加联系人

    在Android系统中,动态添加联系人是一项常见的功能,它允许应用程序在运行时向用户的设备通讯录插入新的联系人信息。这个过程涉及到Android的Content Provider机制,权限管理,以及使用ContentResolver进行数据操作...

    android读取手机联系人

    在Android系统中,读取手机联系人是一项常见的功能,它涉及到Android的核心组件——ContentProvider。ContentProvider是Android四大组件之一,用于在不同的应用程序之间共享数据。在这个场景下,我们将主要探讨如何...

    android2.2获取本机号码,获取本机联系人信息并拨打电话

    在Android系统中,获取本机号码、联系人信息以及拨打电话是常见的功能需求,尤其是在开发与通讯相关的应用程序时。在Android 2.2(API级别8)版本中,这些功能的实现有一些特定的注意事项和权限要求。下面我们将详细...

    android访问通讯录中的联系人和添加联系人

    在Android系统中,访问和管理通讯录是常见的功能需求,涉及到Android框架中对联系人数据的API使用。本文将深入探讨如何在Android应用中实现访问通讯录中的联系人以及添加新联系人的步骤。 首先,我们需要了解...

Global site tag (gtag.js) - Google Analytics