• android: 通过内容提供器读取系统联系人


    读取系统联系人

     由于我们之前一直使用的都是模拟器,电话簿里面并没有联系人存在,所以现在需要自 己手动添加几个,以便稍后进行读取。打开电话簿程序,界面如图 7.1 所示。

     

    图   7.1

    可以看到,目前电话簿里是没有任何联系人的,我们可以通过点击 Create a new contact按钮来对联系人进行创建。这里就先创建两个联系人吧,分别填入他们的姓名和手机号,如 图 7.2 所示。

     

    图   7.2

    这样准备工作就做好了,现在新建一个 ContactsTest 项目,让我们开始动手吧。 首先还是来编写一下布局文件,这里我们希望读取出来的联系人信息能够在 ListView 中

    显示,因此,修改 activity_main.xml 中的代码,如下所示:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" >

    <ListView android:id="@+id/contacts_view" android:layout_width="match_parent" android:layout_height="match_parent" >

    </ListView>

    </LinearLayout>

    简单起见,LinearLayout 里就只放置了一个 ListView。接着修改 MainActivity 中的代码,

    如下所示:

    public class MainActivity extends Activity { ListView contactsView; ArrayAdapter<String> adapter;

    List<String> contactsList = new ArrayList<String>();

    @Override

    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

    contactsView = (ListView) findViewById(R.id.contacts_view);

    adapter = new ArrayAdapter<String>(this, android.R.layout. simple_list_item_1, contactsList);

    contactsView.setAdapter(adapter);

    readContacts();

    }

    private void readContacts() { Cursor cursor = null;

    try {

    // 查询联系人数据

    cursor = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);

    while (cursor.moveToNext()) {

    // 获取联系人姓名

    String displayName = cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));

    // 获取联系人手机号

    String number = cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER));

    contactsList.add(displayName + " " + number);

    }

    } catch (Exception e) {

    e.printStackTrace();

    } finally {

    if (cursor != null) {

    cursor.close();

    }

    }

    }

    }

    在 onCreate()方法中,我们首先获取了 ListView 控件的实例,并给它设置好了适配器, 然后就去调用 readContacts()方法。下面重点看下 readContacts()方法,可以看到,这里使用 了 ContentResolver 的 query()方法来查询系统的联系人数据。不过传入的 Uri 参数怎么有些奇 怪 啊 , 为 什 么 没 有 调 用 Uri.parse() 方 法 去 解 析 一 个 内 容 URI 字 符 串 呢 ? 这 是 因 为 ContactsContract.CommonDataKinds.Phone 类已经帮我们做好了封装,提供了一个CONTENT_URI 常量,而这个常量就是使用 Uri.parse()方法解析出来的结果。接着我们对 Cursor 对象进行遍 历 , 将 联 系 人 姓 名 和 手 机 号 这 些 数 据 逐 个 取 出 , 联 系 人 姓 名 这 一 列 对 应 的 常 量 ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,联系人手机号这一列对应的常 量是 ContactsContract.CommonDataKinds.Phone.NUMBER。两个数据都取出之后,将它们进 行拼接,并且中间加上换行符,然后将拼接后的数据添加到 ListView 里。最后千万不要忘记 将 Cursor 对象关闭掉。

    这样就结束了吗?还差一点点,读取系统联系人也是需要声明权限的,因此修改AndroidManifest.xml 中的代码,如下所示:

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

    android:versionCode="1"

    android:versionName="1.0" >

    ……

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

    ……

    </manifest>

    加入了 android.permission.READ_CONTACTS 权限,这样我们的程序就可以访问到系统 的联系人数据了。现在才算是大功告成,让我们来运行一下程序吧,效果如图 7.3 所示。

    图   7.3

    刚刚添加的两个联系人的数据都成功读取出来了!说明跨程序访问数据的功能确实是实 现了。

  • 相关阅读:
    69.广搜练习:  最少转弯问题(TURN)
    51..分治算法练习:  4378 【Laoguo】循环比赛
    50.分治算法练习:  二分算法:  2703 奶牛代理商 XII
    [转载]双向广搜
    49.分治算法练习:  1497 取余运算
    48.贪心练习:  1621 混合牛奶
    47..贪心  失恋28天-追女孩篇
    46.贪心算法练习:  区间合并
    45.分支算法练习:  7622:求排列的逆序数
    44.分治算法练习:  一元三次方程求解
  • 原文地址:https://www.cnblogs.com/zgqys1980/p/5252753.html
Copyright © 2020-2023  润新知