在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币余额
- 我的收藏
- 我的下载
- 下载帮助