[권한 묻기]
val checkPermission =
ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.READ_CONTACTS)
if (checkPermission == PackageManager.PERMISSION_GRANTED) {
val list = getContacts()
initView(list)
} else {
requestContactPermissionLauncher.launch(Manifest.permission.READ_CONTACTS)
}
[사용자에게 권한 받기]
private val requestContactPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
val list: MutableList<Contact>
if (isGranted) {
// 권한을 허용한 경우 처리
list = getContacts()
} else {
// 권한을 거절한 경우 처리
list = DataManager.getContacts().toMutableList()
Toast.makeText(
requireContext(),
getString(R.string.permission_contact_denied_msg),
Toast.LENGTH_LONG
).show()
}
initView(list)
}
기기 연락처에 접근하고 받아오는 개념이 생소해 시간이 좀 걸렸다. 일단 기본 뼈대는 공식문서를 보며 공부했다.
연락처 제공자 | Android 개발자
아래 그림에 나온 단어들을 살펴보면 알 수 있듯이 기기 내부의 db가 있고 3개의 테이블이 나뉘어있어 여기에서 내가 필요한 정보를 query에 담아 뽑아오는 식으로 구현한다.
내가 구현한 코드는 아래와 같다.
private fun getContacts(): MutableList<Contact> {
val contacts = requireContext().contentResolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
null,
null,
null
)
val list = mutableListOf<Contact>()
contacts?.let {
if (contacts.count > 0) {
while (it.moveToNext()) {
val id = it.getInt(it.getColumnIndexOrThrow(ContactsContract.Data._ID))
val name =
it.getString(contacts.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))
val phoneNumber =
it.getString(contacts.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER))
val emailCursor = requireContext().contentResolver.query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
arrayOf("$id"),
null
)
emailCursor?.let {
if(it != null && it.moveToFirst()) {
val emailIndex: Int =
emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)
val email: String = emailCursor.getString(emailIndex)
emailCursor.close()
val model = Contact(
Img = R.drawable.dialog_profile,
name = name,
phonenumber = phoneNumber.toString(),
email = email,
birth = "",
nickname = "",
)
list.add(model)
}
}
}
}
}
return list
}