Android跳转到通讯录选择联系人

本文介绍了一种在Android应用中实现联系人选择的方法。通过Intent启动系统联系人选择界面,并解析返回的数据来获取选定联系人的姓名和电话号码。
Intent intent = new Intent();
Uri uri = Uri.parse("content://contacts");
intent.setAction(Intent.ACTION_PICK);
intent.setData(uri);
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(intent, CODE_FOR_STARTACTIVITY_CONTACTS);


if (data != null) {
    Uri uri = data.getData();
    String[] result = LoadDBUtils.getPhoneContacts(MainActivity.this, uri);
}

public static String[] getPhoneContacts(Context context, Uri uri) {
    String[] contact = new String[2];
    ContentResolver cr = context.getContentResolver();
    Cursor cursor = cr.query(uri, new String[]{ContactsContract.Contacts.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Phone.NUMBER}, null, null, null);
    if (cursor != null) {
        cursor.moveToFirst();
        if (cursor.getCount() > 0) {
            do {
                contact[0] = cursor.getString(0);
                contact[1] = cursor.getString(1);
            } while (cursor.moveToNext());
        }
        cursor.close();
    } else {
        return null;
    }
    return contact;
}

Android 应用中实现跳转通讯录并获取联系人信息展示到页面的功能,需要完成以下几个关键步骤: ### 1. 配置应用权限 在 `AndroidManifest.xml` 文件中添加必要的权限声明,以确保应用可以访问设备的联系人数据。以下为必需的权限配置: ```xml <uses-permission android:name="android.permission.READ_CONTACTS" /> ``` 如果希望支持写入联系人功能,还可以添加: ```xml <uses-permission android:name="android.permission.WRITE_CONTACTS" /> ``` 同时,在运行时向用户请求权限,因为从 Android 6.0(API 级别 23)开始,系统要求应用在运行时动态请求危险权限[^4]。 ### 2. 跳转通讯录界面 通过构建一个 `Intent` 来启动系统的联系人选择界面。使用 `Intent.ACTION_PICK` 并指定类型为 `ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE`,以便让用户选择一个联系人。示例代码如下: ```java private static final int REQUEST_CODE_PICK_CONTACT = 1; private void intentToContact() { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); startActivityForResult(intent, REQUEST_CODE_PICK_CONTACT); } ``` ### 3. 获取选中的联系人信息 在 `onActivityResult` 方法中处理返回的数据,并提取出联系人的姓名和电话号码。可以通过 `ContentResolver` 查询联系人数据库来获取详细信息。具体实现如下: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_PICK_CONTACT && resultCode == RESULT_OK) { Uri contactUri = data.getData(); String[] projection = new String[]{ ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER }; Cursor cursor = getContentResolver().query(contactUri, projection, null, null, null); if (cursor != null && cursor.moveToFirst()) { int nameIndex = cursor.getColumnIndex(projection[0]); int numberIndex = cursor.getColumnIndex(projection[1]); String name = cursor.getString(nameIndex); String number = cursor.getString(numberIndex); // 将 name 和 number 展示到 UI 页面上 TextView textView = findViewById(R.id.contact_info); textView.setText("Name: " + name + "\nNumber: " + number); cursor.close(); } } } ``` ### 4. 动态请求权限 在调用跳转通讯录方法之前,应检查是否已经获得了读取联系人的权限。如果没有,则需要请求权限: ```java if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 1); } else { intentToContact(); } ``` ### 5. 处理权限请求结果 在 `onRequestPermissionsResult` 中处理用户的权限授予情况,如果用户同意了权限请求,则继续执行跳转通讯录的操作。 ```java @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { intentToContact(); } else { Toast.makeText(this, "Permission denied to read contacts", Toast.LENGTH_SHORT).show(); } } } ``` ### 注意事项 - 在实际开发过程中,还需考虑不同 Android 版本对权限管理的变化,尤其是针对 Android 10 及以上版本引入的分区存储特性。 - 如果是在跨平台框架如 UniApp 中实现类似功能,除了上述原生 Android 的权限配置外,还需要按照框架的要求进行额外的配置,例如在 `manifest.json` 或者相关配置文件中声明权限和隐私描述[^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值