Android从「我」个人资料获取所有者手机号与头像的实现方法(含代码)
获取联系人中「ME」的手机号和头像(Android实现)
嘿,要拿到联系人列表里标记为「ME」的个人资料(手机号+头像)其实挺简单的,核心就是借助Android系统的Contacts Provider组件来查询对应的数据。我给你拆解下具体步骤和完整代码:
一、核心逻辑说明
- 系统里的「ME」其实就是当前用户的个人资料联系人,对应Contacts表中
IS_USER_PROFILE = 1的条目,这是我们查询的关键筛选条件 - 先通过这个条件找到该联系人的唯一ID(
contactId),再基于ID分别查询手机号(关联Phone表)和头像(从Contacts表的头像字段读取) - 必须申请
READ_CONTACTS权限,Android 6.0及以上版本还要做动态权限申请,不然会直接崩溃
二、权限配置
首先在AndroidManifest.xml里添加权限声明,这是基础:
<uses-permission android:name="android.permission.READ_CONTACTS" />
三、完整代码示例
我补全了你提供的onCreate方法,加上了权限检查和完整的查询逻辑:
public class MainActivity extends AppCompatActivity { private static final int REQUEST_READ_CONTACTS = 100; private TextView name, number; private ImageView avatar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 绑定UI控件 name = findViewById(R.id.txtv_contact_name); number = findViewById(R.id.txtv_contact_number); avatar = findViewById(R.id.imgv_contact_avatar); // 先检查是否有读取联系人的权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // 没有权限就申请 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_READ_CONTACTS); } else { // 权限已授权,直接查询 fetchMyContactInfo(); } } // 处理权限申请的回调 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_READ_CONTACTS) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 用户同意了权限,开始查询 fetchMyContactInfo(); } else { Toast.makeText(this, "需要读取联系人权限才能获取个人资料", Toast.LENGTH_SHORT).show(); } } } // 核心方法:查询「ME」的联系人信息 private void fetchMyContactInfo() { String contactId = null; // 第一步:找到用户个人资料的Contact ID String[] contactsProjection = { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME }; // 筛选条件:IS_USER_PROFILE = 1 就是系统标记的「ME」 String contactsSelection = ContactsContract.Contacts.IS_USER_PROFILE + " = ?"; String[] contactsSelectionArgs = {"1"}; Cursor contactsCursor = getContentResolver().query( ContactsContract.Contacts.CONTENT_URI, contactsProjection, contactsSelection, contactsSelectionArgs, null); if (contactsCursor != null && contactsCursor.moveToFirst()) { contactId = contactsCursor.getString(contactsCursor.getColumnIndex(ContactsContract.Contacts._ID)); String displayName = contactsCursor.getString(contactsCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); name.setText(displayName); contactsCursor.close(); } // 如果没找到个人资料,直接提示并返回 if (contactId == null) { Toast.makeText(this, "未找到个人资料联系人", Toast.LENGTH_SHORT).show(); return; } // 第二步:查询手机号 String[] phoneProjection = { ContactsContract.CommonDataKinds.Phone.NUMBER }; String phoneSelection = ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?"; String[] phoneSelectionArgs = {contactId}; Cursor phoneCursor = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, phoneProjection, phoneSelection, phoneSelectionArgs, null); if (phoneCursor != null && phoneCursor.moveToFirst()) { String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); number.setText(phoneNumber); phoneCursor.close(); } else { number.setText("未绑定手机号"); } // 第三步:加载头像 // 用系统方法加载缩略图,同时设置默认图 Uri avatarUri = ContactsContract.Contacts.loadPhotoThumbnail(this, ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(contactId)), R.drawable.ic_default_avatar, // 替换成你的默认头像资源 null); if (avatarUri != null) { // 建议用Glide/Picasso加载,避免OOM Glide.with(this).load(avatarUri).circleCrop().into(avatar); // 不用图片库的话可以用原生方法:avatar.setImageURI(avatarUri); } else { avatar.setImageResource(R.drawable.ic_default_avatar); } } }
四、几个关键点要注意
- 记得提前准备好默认头像资源(比如
ic_default_avatar),避免没有头像时显示空白 - 加载头像建议用Glide或Picasso这类图片加载库,原生
setImageURI在处理大图片时容易出现内存溢出 - 部分设备可能没有设置个人资料,代码里已经做了空值判断,要确保这种情况有友好提示
内容的提问来源于stack exchange,提问作者jamilxt
相关产品推荐
相关产品推荐

