Android通过ContentResolver获取联系人信息实践

2 下载量 110 浏览量 更新于2024-08-30 1 收藏 154KB PDF 举报
"这篇资源主要介绍了如何在Android应用中利用ContentResolver访问并获取手机上的联系人信息。提供了两种方法:一种是直接获取所有联系人信息并显示在ListView中,另一种是通过按钮跳转到系统联系人界面,选择单个联系人进行显示。" 在Android开发中,ContentResolver是一个关键组件,它允许应用与系统的ContentProvider进行交互,ContentProvider则是Android系统中数据共享的桥梁。当需要获取手机联系人信息时,ContentResolver可以帮助我们完成这项任务。 第一种方法:直接获取所有手机联系人信息 1. 权限申请:首先,在AndroidManifest.xml文件中,必须声明读取联系人权限: ```xml <uses-permission android:name="android.permission.READ_CONTACTS" /> ``` 这个权限使得应用有权利访问用户的联系人数据。 2. 布局设计:在activity_main.xml文件中,定义一个ListView用于展示获取到的联系人信息: ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.android_25.MainActivity"> <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/lv_lxr" /> </ListView> ``` 3. 代码实现:在MainActivity中,使用ContentResolver查询联系人数据,并填充到ListView: ```java // 获取ContentResolver实例 ContentResolver resolver = getContentResolver(); // 查询联系人数据 Cursor cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); // 创建适配器并绑定数据到ListView ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, new ArrayList<>()); while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); adapter.add(name + ": " + number); } ListView lvLxr = findViewById(R.id.lv_lxr); lvLxr.setAdapter(adapter); cursor.close(); ``` 第二种方法:通过按钮跳转获取单个联系人信息 1. 布局设计:在activity_main.xml中添加一个Button,点击后跳转到系统联系人选择界面。 2. 实现点击事件:在MainActivity中,监听Button的点击事件,启动系统联系人选择Intent,获取用户选择的联系人信息: ```java Button btnSelect = findViewById(R.id.btn_select); btnSelect.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(intent, SELECT_CONTACT_REQUEST_CODE); } }); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == SELECT_CONTACT_REQUEST_CODE && resultCode == RESULT_OK) { // 获取选中的联系人Uri Uri contactUri = data.getData(); // 查询联系人详细信息 Cursor cursor = resolver.query(contactUri, null, null, null, null); if (cursor != null && cursor.moveToFirst()) { String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); // 显示在ListView或其他控件中 // ... } cursor.close(); } } ``` 这两种方法都可以有效地获取到手机联系人信息。第一种方法适用于一次性展示所有联系人,而第二种方法则让用户能够选择单个联系人进行查看或操作。在实际应用中,开发者可以根据需求选择合适的方法。