如何一次性选取多个手机联系人并加载至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
相关产品推荐
相关产品推荐

