Выберите и извлеките контактную информацию, используя Intent и ActivityResultContracts.

У меня есть кнопка, чтобы открыть и выбрать контакт для некоторых его конкретных данных - имени и номера, используя ActivityResultContracts.PickContact. Используя руководство с этой страницы и некоторые модификации, я смог успешно получить имя контакта.

У меня есть это в моем файле манифеста для разрешения

      <uses-permission android:name="android.permission.READ_CONTACTS" />

Проблема в том, что мое приложение вылетает всякий раз, когда я выбираю контакт, чтобы получить его номер.

Исключение:

java.lang.IllegalArgumentException: недопустимые данные столбца1

Могу ли я получить больше информации о том, что происходит и как заставить его работать так, как задумано?

      ///THE COMMENTED LINES ARE FOR CONTACT'S NAME AND IT WORKED PERFECTLY (COMMENT THE NUMBER LINES FOR TEST)

@Composable
@Preview
fun openAndSelectContact() {
    val context = LocalContext.current
    val launchContact = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.PickContact()
    ) {

        val projection: Array<String> = arrayOf(
//            ContactsContract.Contacts.DISPLAY_NAME,
                        ContactsContract.CommonDataKinds.Phone.NUMBER
        )


        context.contentResolver.query(
            it!!,
            projection,
            null,
            null,
            null
        )
            .use { cursor ->
                if (cursor!!.moveToFirst()) {
                      val numberIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)
                      val number = cursor.getString(numberIndex)
                      Toast.makeText(context, "Number is $number!", Toast.LENGTH_SHORT).show()

//                    val nameIndex =
//                        cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)
//                    val name = cursor.getString(nameIndex)
//                    Toast.makeText(context, "Name is $name!", Toast.LENGTH_SHORT)
//                        .show()

                }
            }
    }


    val launchContactPermission = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.RequestPermission()
    ) { isGranted ->
        if (isGranted) {
            launchContact.launch()
        } else {
            Toast.makeText(context, "Permission Denied!", Toast.LENGTH_SHORT)
                .show()
        }

    }

    Button(
        content = { Text("IMPORT FROM CONTACT") },
        onClick = {
            when (PackageManager.PERMISSION_GRANTED) {
                //First time asking for permission ... to be granted by user
                ContextCompat.checkSelfPermission(
                    context,
                    Manifest.permission.READ_CONTACTS
                ) -> {
                    launchContact.launch()
                }
                else -> {
                    //If permission has been already granted
                    launchContactPermission.launch(Manifest.permission.READ_CONTACTS)
                }
            }
        }
    )
}

0 ответов