Android ContentProvider之通讯录的简单实现

时间:2021-7-3 作者:qvyue

在上一篇我们了解了ContentProvider的基本使用后,这一篇我们就来小小的实验一下,通过ContentProvider来实现我们读取手机通讯录的简单功能。

第一步:声明权限
因为在Android 6.0之后,Android就对权限这一块做了修改,凡是涉及到危险的地方,都必须由用户手动赋予权限才能做相对应的操作,否则的话就会报错。申请权限并不复杂,首先在清单文件里面加入我们想要申请的权限。如下:

接着代码判断该权限是否得到用户授权,如果没有授权的话,则弹出对话框提示用户授予;如果已经得到这个权限的话,则直接读取手机上面的联系人信息。

fun readInfo(view: View) {
    if (ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_CONTACTS
        ) != PackageManager.PERMISSION_GRANTED
    ) {
        ActivityCompat.requestPermissions(
            this,
            arrayOf(Manifest.permission.READ_CONTACTS),
            requestCodeValue
        )
    } else {
        readContacts()
    }
}
override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array,
    grantResults: IntArray
) {
    when (requestCode) {
        requestCodeValue -> {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                readContacts()
            } else {
                Toast.makeText(this, "由于你拒绝了此权限,所以导致获取联系人失败", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

第二步:读取手机联系人信息

/**
 * 读取手机的联系人信息
 */
private fun readContacts() {
    var cursor: Cursor? = null
    try {
        cursor = contentResolver.query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            null,
            null,
            null,
            null
        )
        if (cursor != null) {
            while (cursor.moveToNext()) {
                // 获取联系人姓名
                val userName =
                    cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))
                // 获取联系人手机号
                val userPhone =
                    cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
                val map: MutableMap = mutableMapOf()
                map["name"] = userName
                map["phone"] = userPhone
                infoList.add(map)
            }
            mAdapter!!.setInfoList(infoList)
        }
    } catch (e: Exception) {
        e.printStackTrace()
    } finally {
        cursor?.close()
    }
}

最终的结果呈现如下:

Android ContentProvider之通讯录的简单实现
1.jpg
Android ContentProvider之通讯录的简单实现
2.jpg
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。