Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 621|回复: 0

[实例教程]读取手机中的联系人信息(android.provider.ContactsCo

[复制链接]

该用户从未签到

发表于 2011-10-22 13:29:38 | 显示全部楼层 |阅读模式
上一篇中使用了打电话发短信的功能,但号码联系人信息我们还不知道。本篇开始讲如何从Android中得到本机联系人的信息。
由于Android较快的版本升级,部分API已经发生了变化。本篇探究的通过ContentProvider机制获取联系人的API从Android2.0开始做了很大调整,原来的android.provider.Contacts类及其下相关类由android.provider.ContactsContract代替。原类体系标记为Deprecated(废弃),因为兼容的原因目前还存在,但不保证以后的更新版本中完全丢弃。

所以本文先从Android2.1以上平台的联系人读取开始说起,下面给出代码在Android2.1/2.2中运行的效果图,




首先,创建类ViewContacts继承ListActivity,并设为为应用的开始Activity。
ViewContacts.java 代码:
package jtapp.contacts;



import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;



import android.app.ListActivity;

import android.database.Cursor;

import android.os.Bundle;

import android.provider.ContactsContract;

import android.widget.SimpleAdapter;



public class ViewContacts extends ListActivity {

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        

        List<HashMap<String, String>> items = fillMaps();        

        SimpleAdapter adapter = new SimpleAdapter(

                        this,items,R.layout.list_item,

                        new String[]{"name","key"},

                        new int[]{R.id.item,R.id.item2});

        this.setListAdapter(adapter);



    }



        private List<HashMap<String, String>> fillMaps() {

                List<HashMap<String, String>> items = new ArrayList<HashMap<String, String>>();



                Cursor cur = null;

                try {

                        // Query using ContentResolver.query or Activity.managedQuery

                        cur = getContentResolver().query(

                                        ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

                        if (cur.moveToFirst()) {

                                int idColumn = cur.getColumnIndex(

                                                ContactsContract.Contacts._ID);

                        int displayNameColumn = cur.getColumnIndex(

                                        ContactsContract.Contacts.DISPLAY_NAME);

                                // Iterate all users

                        do {

                                        String contactId;

                                        String displayName;

                                        String phoneNumber = "";

                                        // Get the field values

                                        contactId = cur.getString(idColumn);

                                        displayName = cur.getString(displayNameColumn);

                                        // Get number of user's phoneNumbers

                                        int numberCount = cur.getInt(cur.getColumnIndex(

                                                        ContactsContract.Contacts.HAS_PHONE_NUMBER));

                                        if (numberCount>0) {

                                                Cursor phones = getContentResolver().query(

                                                                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,

                                                                null,

                                                                ContactsContract.CommonDataKinds.Phone.CONTACT_ID

                                                                + " = " + contactId

                                                                /*+ " and " + ContactsContract.CommonDataKinds.Phone.TYPE

                                                                + "=" + ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE*/,

                                                                null, null);

                                                if (phones.moveToFirst()) {

                                                        int numberColumn = phones.getColumnIndex(

                                                                        ContactsContract.CommonDataKinds.Phone.NUMBER);

                                                        // Iterate all numbers

                                                        do {

                                                                phoneNumber += phones.getString(numberColumn) + ",";

                                                        } while (phones.moveToNext());

                                                }

                                        }

                                        // Add values to items

                                        HashMap<String, String> i = new HashMap<String, String>();

                                        i.put("name", displayName);

                                        i.put("key", phoneNumber);

                                        items.add(i);

                                } while (cur.moveToNext());

                        } else {

                                HashMap<String, String> i = new HashMap<String, String>();

                                i.put("name", "Your Phone");

                                i.put("key", "Have No Contacts.");

                                items.add(i);

                        }

                } finally {

                        if (cur != null)

                                cur.close();

                }

                return items;

        }

}

main.xml 代码:
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    androidrientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

<TextView  

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="show your phone's contacts:"

    />

<ListView android:id="@id/android:list"

    android:layout_width="fill_parent"

    android:layout_height="0dip"

    android:layout_weight="1"

    android:drawSelectorOnTop="false"

    />

</LinearLayout>
list_item.xml 代码:
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

        <TableRow android:id="@+id/TableRow01"

                          android:layout_width="wrap_content"

                          android:layout_height="wrap_content">

                <TextView android:id="@+id/item"

                          xmlns:android="http://schemas.android.com/apk/res/android"

                          android:layout_width="wrap_content"

                          android:layout_height="wrap_content"

                          android:textSize="20px" />

                <TextView android:text=": "

                                  xmlns:android="http://schemas.android.com/apk/res/android"

                          android:layout_width="wrap_content"

                          android:layout_height="wrap_content"

                          android:textSize="20px" />

                <TextView android:id="@+id/item2"

                          xmlns:android="http://schemas.android.com/apk/res/android"

                          android:layout_width="wrap_content"

                          android:layout_height="wrap_content"

                          android:textSize="20px" />

        </TableRow>

</LinearLayout>
AndroidManifest.xml 增加uses权限READ_CONTACTS 代码:
<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

        package="jtapp.contacts" android:versionCode="1" android:versionName="1.0">

        <application android:icon="@drawable/icon" android:label="@string/app_name">

                <activity android:name=".ViewContacts" android:label="@string/app_name">

                        <intent-filter>

                                <action android:name="android.intent.action.MAIN" />

                                <category android:name="android.intent.category.LAUNCHER" />

                        </intent-filter>

                </activity>

        </application>

        <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>

</manifest>
以上文件编写好后,应用就能够在Android2.1模拟器上正确运行了。

那么该app如果在android1.6上运行,会怎么样呢?1.6上并没有ContactsContract类体系,所以就会报错了。需要注意,ContactContract类是在API Level 5增加的,之前的Android版本并不支持。
在Android 1.6 (API Level 4)上,获取联系人的方法将fillMaps()实现为如下:
private List<HashMap<String, String>> fillMaps() {

                List<HashMap<String, String>> items = new ArrayList<HashMap<String, String>>();



                Cursor cur = null;

                try {

                        // Form an array specifying which columns to return.

                        String[] projection = new String[] {

                                        People._ID,

                                        People.NAME,

                                        People.NUMBER

                        };

                        // query using ContentResolver.query or Activity.managedQuery

                        cur = getContentResolver().query(

                                        People.CONTENT_URI,projection, null,null, null);

                        if (cur.moveToFirst()) {

                                String name;

                                String phoneNumber;

                                int nameColumn = cur.getColumnIndex(People.NAME);

                                int phoneColumn = cur.getColumnIndex(People.NUMBER);

                                do {

                                        // Get the field values

                                        name = cur.getString(nameColumn);

                                        phoneNumber = cur.getString(phoneColumn);

                                        // Do something with the values.

                                        HashMap<String, String> i = new HashMap<String, String>();

                                        i.put("name", name);

                                        i.put("key", phoneNumber);

                                        items.add(i);

                                } while (cur.moveToNext());

                        } else {

                                HashMap<String, String> i = new HashMap<String, String>();

                                i.put("name", "Your Phone");

                                i.put("key", "Have No Contacts.");

                                items.add(i);

                        }

                } finally {

                        if (cur != null)

                                cur.close();

                }

                return items;

        }

那么就能在1.6上运行了,效果截图如下:


联系人API,在Android2.0后产生变化,如果使用如上1.6版本的调用,你会发现在2.1下姓名有了,但电话号码不显示了。仔细观察可以发现,People.CONTENT_URI等调用在2.0以上的sdk中都标记了Deprecated。这一点,对于编写希望能够同时兼容1.6与2.x版本的应用造成了困难。那么,如果应用涉及到联系人的读取,非得要编写多个版本的apk了吗? 其实,我们可以使用判断当前系统API Level的方法编写两套代码备用,这个就留给大家去实践了。

获得系统API level方法:
int version = android.provider.Settings.System.getInt(context

     .getContentResolver(),

     android.provider.Settings.System.SYS_PROP_SETTING_VERSION,

     3);
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-9 07:37 , Processed in 0.430992 second(s), 47 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表