在Android平台上,获取本地电话簿信息是常见的需求,主要用于实现联系人管理、社交应用等功能。本文将详细讲解如何通过编程方式获取这些数据,包括电话号码、电子邮件(EMAIL)以及联系人的头像图片,并展示在ListView中。 我们需要权限声明。在AndroidManifest.xml文件中,添加读取联系人数据的权限: ```xml <uses-permission android:name="android.permission.READ_CONTACTS" /> ``` 接下来,我们创建一个用于存储联系人信息的数据模型类,例如`ContactInfo.java`: ```java public class ContactInfo { private String name; private String phoneNumber; private String email; private Bitmap avatar; // 构造函数、getter和setter方法... } ``` 然后,我们编写一个方法来从系统联系人数据库中获取数据: ```java public List<ContactInfo> getContacts(Context context) { List<ContactInfo> contactList = new ArrayList<>(); ContentResolver contentResolver = context.getContentResolver(); Cursor cursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); if (cursor != null && cursor.getCount() > 0) { while (cursor.moveToNext()) { ContactInfo contact = new ContactInfo(); // 获取姓名 String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); contact.setName(displayName); // 获取电话号码 String phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); contact.setPhoneNumber(phoneNumber); // 获取电子邮件 Cursor emailCursor = contentResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, new String[]{ContactsContract.CommonDataKinds.Email.DATA}, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{String.valueOf(cursor.getLong(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID)))}, null); if (emailCursor != null && emailCursor.getCount() > 0) { emailCursor.moveToFirst(); String email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); contact.setEmail(email); emailCursor.close(); } // 获取头像 Uri photoUri = Uri.withAppendedPath(ContactsContract.Data.CONTENT_URI, String.valueOf(cursor.getLong(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID)))); contact.setAvatar(getContactPhoto(context, photoUri)); contactList.add(contact); } cursor.close(); } return contactList; } private Bitmap getContactPhoto(Context context, Uri uri) { if (uri == null) { return null; } try (InputStream inputStream = context.getContentResolver().openInputStream(uri)) { return BitmapFactory.decodeStream(inputStream); } catch (IOException e) { Log.e("Contact", "Error loading contact photo", e); return null; } } ``` 在上面的代码中,我们使用`ContentResolver`查询`ContactsContract`提供的数据,获取到联系人的姓名、电话号码和电子邮件。为了获取头像,我们首先得到联系人的URI,然后通过`getContactPhoto`方法从输入流中解码为Bitmap。 我们需要一个适配器(Adapter)来把数据绑定到ListView: ```java public class ContactListAdapter extends ArrayAdapter<ContactInfo> { public ContactListAdapter(Context context, int resource, List<ContactInfo> objects) { super(context, resource, objects); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(getContext()).inflate(R.layout.contact_item, parent, false); } ContactInfo contact = getItem(position); TextView nameView = convertView.findViewById(R.id.name); TextView numberView = convertView.findViewById(R.id.number); TextView emailView = convertView.findViewById(R.id.email); ImageView avatarView = convertView.findViewById(R.id.avatar); nameView.setText(contact.getName()); numberView.setText(contact.getPhoneNumber()); emailView.setText(contact.getEmail()); avatarView.setImageBitmap(contact.getAvatar()); return convertView; } } ``` 在这个适配器中,我们重写了`getView`方法,将每个`ContactInfo`对象的数据填充到ListView的每一项视图中。 现在,你可以在Activity或Fragment中调用`getContacts`方法获取联系人数据,然后使用`ContactListAdapter`实例化适配器并将其设置给ListView。这样,本地电话本的信息,包括电话号码、电子邮件和头像图片,就能成功显示在ListView中了。 在实际开发中,考虑到性能和内存使用,你可能还需要对数据进行分页加载,或者使用异步任务来处理联系人信息的获取和图片的加载,以避免阻塞UI线程。此外,注意处理可能的空值和异常情况,确保应用的稳定性和用户体验。
- 1
- x17134221762013-07-23不错 能读取本地通讯录就更好了
- 粉丝: 2
- 资源: 24
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Delphi 12 控件之FlashAV FFMPEG VCL Player For Delphi v7.0 for D10-D11 Full Source.7z
- 新年贺岁代码!喜迎新年
- Python编程理论知识、基本语法与应用方式
- 模块化多电平变器(MMC),本模型为三相MMC整流器 控制策略:双闭环控制、桥臂电压均衡控制、模块电压均衡控制、环流抑制控制策略、载波移相调制,可供参考学习使用,默认发2020b版本及以上
- kdeconnect-android1.32.9
- IMG20241223015444.jpg
- 质子交膜燃料电池PEMFC Matlab simulink滑模控制模型,过氧比控制,温度控制,阴,阳极气压控制
- file_241223_024438_84523.pdf
- 新年主题:文化内涵、传统习俗与现代庆祝方式解析
- 光储并网VSG系统Matlab simulink仿真模型,附参考文献 系统前级直流部分包括光伏阵列、变器、储能系统和双向dcdc变器,后级交流子系统包括逆变器LC滤波器,交流负载 光储并网VSG系
- 安卓手机端安装xapk、apkm软件 并且支持解压 压缩功能
- python编写微信读取smart200plc的数据发送给微信联系人
- 光储并网simulink仿真模型,直流微电网 光伏系统采用扰动观察法是实现mppt控制,储能可由单独蓄电池构成,也可由蓄电池和超级电容构成的混合储能系统,并采用lpf进行功率分配 并网采用pq控制
- 172.16.100.195
- FeiQ.rar 局域网内通信服务软件
- NC Cloud 2020 05应用方案手册-报表平台