一.布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.activity.Test2Activity">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#eeeeee"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:text="联系人列表"
android:textColor="@color/black" />
<ListView
android:id="@+id/lv_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_title" />
</RelativeLayout>
二.全局属性:
lateinit var lv_list: ListView
lateinit var adapter: ArrayAdapter<String>
val contactList = ArrayList<String>()
val READ_CONTACTS_PMSN = Manifest.permission.READ_CONTACTS
val GRANTED = PackageManager.PERMISSION_GRANTED
三.onCreate()方法:初始化View,配置ListView的adapter和数据源,检测及申请权限
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_test2)
lv_list = findViewById(R.id.lv_list)
adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, contactList)
lv_list.adapter = adapter
if (ContextCompat.checkSelfPermission(this, READ_CONTACTS_PMSN) != GRANTED) {
// 没有权限,去申请
ActivityCompat.requestPermissions(this, arrayOf(READ_CONTACTS_PMSN), 1)
} else {
// 已经有读取通讯录的权限
readContact()
}
}
四.manifest文件配置读取通讯录权限:
<uses-permission android:name="android.permission.READ_CONTACTS" />
五.权限申请回调函数:
// 申请权限回调
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
1 -> {
if (grantResults.isNotEmpty() && grantResults[0] == GRANTED) {
readContact()
} else {
Toast.makeText(this, "您拒绝了读取通讯录权限", Toast.LENGTH_SHORT).show()
}
}
}
}
六.读取通讯录联系人数据:
// 读取联系人数据
@SuppressLint("Range")
fun readContact() {
val uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI
val nameColStr = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
val numberColStr = ContactsContract.CommonDataKinds.Phone.NUMBER
contentResolver.query(uri, null, null, null, null)
?.apply {
while (moveToNext()) {
val name = getString(getColumnIndex(nameColStr))
val number = getString(getColumnIndex(numberColStr))
contactList.add("$name\n$number")
}
adapter.notifyDataSetChanged()
close()
}
}