Android 读取联系人

本文介绍了在Android中如何读取联系人信息,包括在AndroidManifest.xml中添加权限声明,以及如何动态申请读取联系人的权限。通过遵循文中步骤,可以成功实现读取设备联系人的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、读取联系人需要获取动态授权

      androidManifest中添加

<uses-permission android:name="android.permission.READ_CONTACTS" />

2、动态进行申请

     

private static final int REQUEST_CODE = 1;
case R.id.iv_linkman:  //这个是点击事件
    //检测程序是否开启权限
    if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_CONTACTS) !=
            PackageManager.PERMISSION_GRANTED) {//没有权限需要动态获取
        //动态请求权限
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_CODE);
    } else {
        getLinkMan();
        Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
        startActivityForResult(intent, 0);
    }
    break;

3、

/**
 * 读取联系人方法
 */

private void getLinkMan() {
    Cursor cursor = null;
    try {
        //查询联系人数据
        cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                null, null, null);

        if (cursor != null) {
            // Log.e("tag","*****************************");
            while (cursor.moveToNext()) {
                //获取联系人姓名
                String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds
                        .Phone.DISPLAY_NAME));
                //获取联系人号码
                String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds
                        .Phone.NUMBER));
                contactsList.add(displayName + "-" + number);
            }
            // adapter.notifyDataSetChanged();
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case 0:
            if (data == null) {
                return;
            }
            //处理返回的data,获取选择的联系人信息**
            Uri uri = data.getData();
            String[] contacts = getPhoneContacts(uri);
            if (contacts != null) {

                // name1.setText(contacts[0]);
                //et_phone是Editext的id
                et_phone.setText(contacts[1]);
                //s1 = phone1.getText().toString().replaceAll(" ", "");
            }
            break;
    }
}
//读取联系人并申请权限
private String[] getPhoneContacts(Uri uri) {

    String[] contact = new String[2];
    //**//得到ContentResolver对象**
    ContentResolver cr = getContentResolver();
    //**//取得电话本中开始一项的光标**
    Cursor cursor = cr.query(uri, null, null, null, null);
    if (cursor != null) {
        cursor.moveToFirst();
        // **//取得联系人姓名**
        int nameFieldColumnIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
        contact[0] = cursor.getString(nameFieldColumnIndex);
        //**//取得电话号码**
        //**版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取**
        //检查是否有读取联系人权限

        String ContactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
        Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + ContactId, null, null);
        if (phone != null) {
            phone.moveToFirst();
            contact[1] = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        }

        phone.close();
        cursor.close();
    } else {
        return null;
    }
    return contact;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == REQUEST_CODE) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {//判断是否给于权限
 	   //这里是为了授权成功直接走联系人,不然的话,你同意授权之后还需再次点击
            getLinkMan();
	    Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
            startActivityForResult(intent, 0);
            //申请读取联系人权限成功
        } else {
            ToastUtils.show("取消授权");

        }
    }
}

最后再加一个  edittext输入手机号自动加空格

布局

<EditText
    android:id="@+id/et_phone"
    android:layout_width="@dimen/dp_126"
    android:layout_height="@dimen/dp_34"
    android:layout_centerVertical="true"
    android:maxLength="13"
    android:numeric="integer"
    android:layout_toLeftOf="@+id/iv_linkman"
    android:gravity="center_vertical|center"
    android:layout_marginRight="@dimen/dp_8"
    android:background="@drawable/order_time_not_background"
    android:hint="用于接收手机短信"
    android:textSize="@dimen/sp_14" />
private void initEditData() {
    et_phone.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
            if (charSequence == null || charSequence.length() == 0) {
                return;
            }
            StringBuilder stringBuilder = new StringBuilder();
            for (int i = 0; i < charSequence.length(); i++) {
                if (i != 3 && i != 8 && charSequence.charAt(i) == ' ') {
                    continue;
                } else {
                    stringBuilder.append(charSequence.charAt(i));
                    if ((stringBuilder.length() == 4 || stringBuilder.length() == 9)
                            && stringBuilder.charAt(stringBuilder.length() - 1) != ' ') {
                        stringBuilder.insert(stringBuilder.length() - 1, ' ');
                    }
                }
            }
            if (!stringBuilder.toString().equals(charSequence.toString())) {
                int index = start + 1;
                if (stringBuilder.charAt(start) == ' ') {
                    if (before == 0) {
                        index++;
                    } else {
                        index--;
                    }
                } else {
                    if (before == 1) {
                        index--;
                    }
                }
                et_phone.setText(stringBuilder.toString());
                et_phone.setSelection(index);

            }
        }

        @Override
        public void afterTextChanged(Editable editable) {

        }
    });

}

 

 

 


 

亲测可实现功能

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值