Android 如何不通过读取联系人权限实现单个联系人选择

319 阅读1分钟

假如没有读取联系人权限,如何实现单个联系人选择呢?

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("","")
            }
        }
    }
}