You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何一次性选取多个手机联系人并加载至ListView

批量选取联系人并加载到ListView的实现方案

1. 替换联系人选择Intent(开启多选支持)

原代码使用的ACTION_PICK仅支持单个联系人选择,需替换为支持多选的Intent配置:

select.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
        intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); // 开启多选模式
        startActivityForResult(intent, RESULT_PICK_CONTACT);
    }
});

2. 提前初始化列表与适配器(避免重复清空数据)

在onCreate中完成列表和适配器的初始化,防止每次选择都重置原有数据:

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

    phone = findViewById(R.id.phone);
    select = findViewById(R.id.select);
    listmain = findViewById(R.id.list);
    shareFact = phone.getText().toString();

    // 初始化联系人列表与适配器
    list = new ArrayList<>();
    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(
            this,
            android.R.layout.simple_list_item_1,
            list);
    listmain.setAdapter(arrayAdapter);

    select.setOnClickListener(...); // 上述修改后的点击事件逻辑
}

3. 修改结果处理逻辑(支持批量读取联系人)

在onActivityResult中处理多选返回的多个联系人Uri,遍历获取手机号并更新列表:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        switch (requestCode) {
            case RESULT_PICK_CONTACT:
                handleMultipleContacts(data);
                break;
        }
    } else {
        Toast.makeText(this, "选取联系人失败", Toast.LENGTH_SHORT).show();
    }
}

private void handleMultipleContacts(Intent data) {
    if (data.getClipData() != null) {
        // 处理多选返回的多个联系人
        int contactCount = data.getClipData().getItemCount();
        for (int i = 0; i < contactCount; i++) {
            Uri contactUri = data.getClipData().getItemAt(i).getUri();
            getContactPhone(contactUri);
        }
    } else if (data.getData() != null) {
        // 兼容单个联系人选择的情况
        getContactPhone(data.getData());
    }
    // 通知适配器数据更新
    ((ArrayAdapter)listmain.getAdapter()).notifyDataSetChanged();
}

private void getContactPhone(Uri uri) {
    Cursor cursor = null;
    try {
        cursor = getContentResolver().query(uri, null, null, null, null);
        if (cursor != null && cursor.moveToFirst()) {
            int phoneColumnIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
            String phoneNumber = cursor.getString(phoneColumnIndex);
            list.add(phoneNumber);
            // 可选:更新TextView显示最后选中的号码
            phone.setText(phoneNumber);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

4. 权限配置(必须步骤)

在AndroidManifest.xml中添加读取联系人权限:

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

针对Android 6.0及以上系统,需动态申请权限,可在onCreate中添加检查逻辑:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 100);
}

内容的提问来源于stack exchange,提问作者Maria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 16:32:50