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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:06:14