假如没有读取联系人权限,如何实现单个联系人选择呢?
1. 去除读取联系人权限
<uses-permission android:name="android.permission.READ_CONTACTS" />
2. 定义ActivityResultContract接收对象
open class PickerContact : ActivityResultContract<Void?, Uri?>() {
override fun createIntent(context: Context, input: Void?): Intent {
val intent = Intent(Intent.ACTION_PICK)
intent.type = ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE
return intent
}
override fun parseResult(resultCode: Int, intent: Intent?): Uri? {
return intent.takeIf { resultCode == Activity.RESULT_OK }?.data
}
}
3. 具体实现
class MainActivity : AppCompatActivity() {
private val selectContact = registerForActivityResult(PickerContact()) {
if (null == it) {
return@registerForActivityResult
}
getContactDataOnIO(this, it, resultCall = { contactName, contactPhoneNumber ->
runOnUiThread {
// contactName 即联系人姓名
// contactPhoneNumber 即联系人电话
}
})
}
@SuppressLint("Range")
fun getContactDataOnIO(context: Context,uri: Uri,resultCall: (String, String) -> Unit) {
CoroutineScope(EmptyCoroutineContext).launch(Dispatchers.IO) {
try {
val cursor = context.contentResolver.query(uri, null, null, null, null)
if (null == cursor) {
resultCall.invoke("","")
return@launch
}
if (cursor.moveToFirst()) {
try {
val contactName = cursor.getString(cursor.getColumnIndex("display_name"))
val contactPhoneNumber = cursor.getString(cursor.getColumnIndex("data1")).replace(Regex("\D"), "")
resultCall.invoke(contactName,contactPhoneNumber)
} catch (_: Throwable) {
resultCall.invoke("","")
}
}
cursor.close()
} catch (_: Throwable) {
resultCall.invoke("","")
}
}
}
}