Android 使用registerForActivityResult获取没有权限的联系人

Android 使用registerForActivityResult获取没有权限的联系人,android,kotlin,android-contacts,android-contentresolver,startactivityforresult,Android,Kotlin,Android Contacts,Android Contentresolver,Startactivityforresult,Kotlin和Android开发新手,在更新了一些库之后,我对以前获取联系人详细信息的工作方法有一些问题,因此我决定尝试在中定义的新registerForActivityResult,而不是调试我的“遗留”代码。在这样做的过程中,如果不需要READ_CONTACTS权限,我就无法再让它工作,因此我希望有人能用一根线索棒打我,帮助我改变新方法,让它像以前的方法那样工作 多谢各位 以前的方法 override fun onViewCreated(view: View, savedInstanceSt

Kotlin和Android开发新手,在更新了一些库之后,我对以前获取联系人详细信息的工作方法有一些问题,因此我决定尝试在中定义的新registerForActivityResult,而不是调试我的“遗留”代码。在这样做的过程中,如果不需要READ_CONTACTS权限,我就无法再让它工作,因此我希望有人能用一根线索棒打我,帮助我改变新方法,让它像以前的方法那样工作

多谢各位

以前的方法

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    fab.setOnClickListener {
        val intent = Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI).also {
            it.type = ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE
            startActivityForResult(it, 1)
        }
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (requestCode == 1 && resultCode == RESULT_OK) {
        val projection = arrayOf(
                ContactsContract.CommonDataKinds.Phone.LOOKUP_KEY,
                ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER
        )

        GlobalScope.launch {
            data?.data?.also { contactUri ->
                context?.contentResolver?.query(contactUri, projection, null, null, null)?.apply {
                    moveToFirst()
                    //val id = viewModel.addPerson(DefaultPerson(getString(0), getString(1), getString(2)))
                    close()
                }
            }
        }
    }
}
新方法

private val getPerson = registerForActivityResult(PickContact()) {
    val projection = arrayOf(
            ContactsContract.CommonDataKinds.Phone.LOOKUP_KEY,
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER
    )

    context?.contentResolver?.query(it!!.toUri(), projection, null, null, null)?.apply {
        moveToFirst()
        //val id = viewModel.addPerson(DefaultPerson(getString(0), getString(1), getString(2)))
        close()
    }
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    fab.setOnClickListener {
        getPerson.launch(0)
    }
}

class PickContact : ActivityResultContract<Int, String?>() {
    override fun createIntent(context: Context, input: Int?) =
            Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI).also {
                it.type = ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE
            }

    override fun parseResult(resultCode: Int, intent: Intent?): String? {
       return if (resultCode == RESULT_OK) intent?.toUri(0) else null
    }
}
private val getPerson=registerForActivityResult(PickContact()){
val投影=阵列(
Contacts contract.CommonDataTypes.Phone.LOOKUP\u键,
Contacts contract.CommonDataTypes.Phone.DISPLAY\u NAME,
Contacts contract.CommonDataTypes.Phone.U号码
)
context?.contentResolver?.query(it!!.tori(),投影,null,null,null)?。应用{
moveToFirst()
//val id=viewModel.addPerson(DefaultPerson(getString(0)、getString(1)、getString(2)))
关闭()
}
}
覆盖已创建的视图(视图:视图,保存状态:捆绑?){
super.onViewCreated(视图,savedInstanceState)
fab.setOnClickListener{
getPerson.launch(0)
}
}
类PickContact:ActivityResultContract(){
覆盖趣味createIntent(上下文:上下文,输入:Int?)=
意图(Intent.ACTION\u PICK,Contacts contract.Contacts.CONTENT\u URI){
it.type=contacts contract.commonDataTypes.Phone.CONTENT\u type
}
覆盖有趣的parseResult(resultCode:Int,intent:intent?):字符串{
如果(resultCode==RESULT\u OK)intent?.toUri(0)else为空,则返回
}
}

看起来我把Uri的事情搞砸了。与此相关的以下更改解决了此问题:

val getPerson = registerForActivityResult(PickContact()) {
    it?.also { contactUri ->
        val projection = arrayOf(
            ContactsContract.CommonDataKinds.Phone.LOOKUP_KEY,
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER
        )

        context?.contentResolver?.query(contactUri, projection, null, null, null)?.apply {
            moveToFirst()
            //val id = viewModel.addPerson(DefaultPerson(getString(0), getString(1), getString(2)))
            close()
        }
    }
}

class PickContact : ActivityResultContract<Int, Uri?>() {
    override fun createIntent(context: Context, input: Int?) =
            Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI).also {
                it.type = ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE
            }

    override fun parseResult(resultCode: Int, intent: Intent?): Uri? {
       return if (resultCode == RESULT_OK) intent?.data else null
    }
}
val getPerson=registerForActivityResult(PickContact()){
它?也是{contactUri->
val投影=阵列(
Contacts contract.CommonDataTypes.Phone.LOOKUP\u键,
Contacts contract.CommonDataTypes.Phone.DISPLAY\u NAME,
Contacts contract.CommonDataTypes.Phone.U号码
)
context?.contentResolver?.query(contactUri、projection、null、null、null)?。应用{
moveToFirst()
//val id=viewModel.addPerson(DefaultPerson(getString(0)、getString(1)、getString(2)))
关闭()
}
}
}
类PickContact:ActivityResultContract(){
覆盖趣味createIntent(上下文:上下文,输入:Int?)=
意图(Intent.ACTION\u PICK,Contacts contract.Contacts.CONTENT\u URI){
it.type=contacts contract.commonDataTypes.Phone.CONTENT\u type
}
覆盖有趣的parseResult(resultCode:Int,intent:intent?):Uri{
如果(resultCode==RESULT\u OK)intent?返回。否则数据为null
}
}