我试图从电话联系人那里获取地址,但没有成功,我能够获取姓名、电话号码和电子邮件,但无法获取地址。调试时,StructuredPostal 的光标看起来与电话号码的光标相同。我在清单中设置了“android.permission.READ_CONTACTS”,因此获得了其他信息。 这是我正在使用的代码:
val launcher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.PickContact(),
onResult = {
val contentResolver: ContentResolver = ctx.contentResolver
val cursor: Cursor? = contentResolver.query(
it!!,
null,
null,
null,
null)
if (cursor != null) {
if (cursor.moveToFirst()) {
changed = true
clientUiState.clientDetails.clientname =
cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))
Log.d("Name", clientUiState.clientDetails.clientname)
val id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID))
val postal: Cursor? = contentResolver.query(
StructuredPostal.CONTENT_URI,
null,
StructuredPostal.FORMATTED_ADDRESS + " = " + id,
null,
null
)
if (postal != null) {
while (postal.moveToFirst()) {
clientUiState.clientDetails.clientAddress =
postal.getString(postal.getColumnIndex(StructuredPostal.FORMATTED_ADDRESS))
Log.d("Address", clientUiState.clientDetails.clientAddress)
}
postal.close()
}
val phones: Cursor? = contentResolver.query(
Phone.CONTENT_URI,
null,
Phone.CONTACT_ID + " = " + id,
null,
null
)
if (phones != null) {
while (phones.moveToNext()) {
clientUiState.clientDetails.clientPhone =
phones.getString(phones.getColumnIndex(Phone.NUMBER))
Log.d("Number", clientUiState.clientDetails.clientPhone)
}
phones.close()
}
val email: Cursor? = contentResolver.query(
Email.CONTENT_URI,
null,
Email.CONTACT_ID + " = ?",
arrayOf(id),
null
)
if (email != null) {
while (email.moveToNext()) {
clientUiState.clientDetails.clientEmail =
email.getString(email.getColumnIndex(Email.DATA))
Log.d("Email", clientUiState.clientDetails.clientEmail)
}
email.close()
}
}
}
}
)
还尝试了 ActivityResultContracts.StartActivityForResult(),但结果相同。我仍然是一个菜鸟,所以可能错过了一些基本的东西,或者吠叫了完全错误的树,并且无法在网络上的其他地方找到答案。
我终于在一篇旧的(2012)帖子中找到了这个问题的答案https://stackoverflow.com/a/13471370/22445779。
if (postal != null) {
if (postal.count == 0) clientUiState.clientDetails.clientAddress = ""
while (postal.moveToNext()) {
val Strt = postal.getString(
postal.getColumnIndex(StructuredPostal.STREET)
)
val Cty = postal.getString(
postal.getColumnIndex(StructuredPostal.CITY)
)
val cntry = postal.getString(
postal.getColumnIndex(StructuredPostal.COUNTRY)
)
clientUiState.clientDetails.clientAddress = Strt + Cty + cntry
}
postal.close()
}