部分app会有添加联系人的需求,针对于此记录一下这个功能
注:虽然功能是实现了,但是有俩点要留意
- 所选的联系人,必须名字和电话号码都有,否则报错且崩溃
- 右侧的字母索引可能部分机型兼容性并不好,如华为~
注:上面说到的问题用了一下午时间已经整理完毕,现可适配、兼容全机型,有需求点这里~我们一起大跳转
效果
权限(注:我没有添加添加也实现了功能;保险起见,我们做权限处理)
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
文内权限请求来自 - 动态权限的多样性处理方式
使用方式 - MainActivity
package nkwl.com.contentdemo;
import android.Manifest;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.tbruyelle.rxpermissions2.RxPermissions;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
public class MainActivity extends AppCompatActivity {
private TextView mName;
private TextView mNum;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mName = findViewById(R.id.tv_name);
mNum = findViewById(R.id.tv_num);
findViewById(R.id.tv_phone).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getPhoneData();
}
});
}
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);
mName.setText("姓名:" + contacts[0]);
mNum.setText("电话号码:" + contacts[1]);
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
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);
//取得电话号码**
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;
}
//动态权限
private void getPhoneData() {
RxPermissions rxPermissions = new RxPermissions(this);
//注:申请一个权限,这个权限组就已经授权
rxPermissions.request(Manifest.permission.READ_CONTACTS,Manifest.permission.READ_PHONE_STATE).subscribe(new Observer<Boolean>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Boolean aBoolean) {
//有权限的状态
if (aBoolean) {
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, 0);
}
//无权限的状态
else {
Toast.makeText(MainActivity.this, "没有授权", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
}
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_phone"
android:layout_width="match_parent"
android:layout_height="45dp"
android:gravity="center"
android:text="获取电话号码" />
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="45dp"
android:gravity="center"
android:text="" />
<TextView
android:id="@+id/tv_num"
android:layout_width="match_parent"
android:layout_height="45dp"
android:gravity="center"
android:text="" />
</LinearLayout>