24.01.15 휴대폰에서 연락처 가져오기

KSang·2024년 1월 22일
0

TIL

목록 보기
32/101

휴대폰에서 연락처 가져오기

권한 요청

일단 권한이 있어야함으로 Manifest에 적어준다

이러면 이제 사용자가 권한을 설정할 수 있게되는데

권한이 없을때 사용자한테 알림을 띄워 요청을 해야 한다

vate fun requestContactPermission() {
        //연락처 퍼미션, 사용자가 퍼미션 허용 했는지 확인
        val status = ContextCompat.checkSelfPermission(this, "android.permission.READ_CONTACTS")
        if (status == PackageManager.PERMISSION_GRANTED) getContacts()
        else {
            //퍼미션 요청 다이얼로그 표시
            ActivityCompat.requestPermissions(
                this,
                arrayOf("android.permission.READ_CONTACTS"),
                100
            )
        }

checkSelfPermission 사용해서 사용자의 권한을 확인한다

현재 상태가 퍼미션 허용인경우 연락처를 가져오는 getContacts를 실행

아닌경우 ActivityCompat에서 requestPermissions로 퍼미션을 요청하는 다이얼로그를 띄운다

연락처 데이터 불러오기

fun getContacts
private fun getContacts() {
        UserList.userList = mutableListOf()
        val contactsUri = ContactsContract.Contacts.CONTENT_URI
        val cursor = contentResolver.query(contactsUri, null, null, null, null)

        cursor?.use { cursor ->
            while (cursor.moveToNext()) {
                val id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID))
                val name =
                    cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))
                var phoneNumber: String? = null
                var email: String? = null
                var profileImageUri: Uri? = null

                if (cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0) {
                    val phoneCursor = contentResolver.query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
                        arrayOf(id),
                        null
                    )
                    phoneCursor?.use {
                        if (it.moveToFirst()) {
                            phoneNumber =
                                it.getString(it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
                        }
                    }
                }

                val emailCursor = contentResolver.query(
                    ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
                    ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", arrayOf(id), null
                )
                emailCursor?.use {
                    if (it.moveToFirst()) {
                        email =
                            it.getString(it.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS))
                    }
                }

                val photoUri =
                    cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_URI))
                val proimg = if (photoUri != null) {
                    savImageToFile(Uri.parse(photoUri))
                } else null
                val user = User(
                    img = proimg,
                    name = name ?: "Unknown",
                    phone = phoneNumber ?: "No Phone",
                    email = email ?: "",
                    event = null,
                    info = "",
                    backgroundImg = null
                )
                UserList.userList.add(user)
            }
        }
        UserList.userList = MyData.sortContacts(UserList.userList).toMutableList()
    }

유저리스트를 저장할 객체를 초기화

ContactsContract의 CONTENT_URI에서 데이터의 URI를 가져온다

contentResolver.query()로 URI를 넣어주는데 ()는 오른쪽부터 Uri데이터, 열, 필터링, 정렬을 나타내고

위에서는 모든 열, 필터링X, 정렬부분은 따로 처리를 해주기때문에 Null로 설정

데이터베이스에서 읽어온 데이터는 Cursor 객체에 저장되는데 커서는 데이터베이스의 각행에 순차적으로 접근할 수 있게 해준다

순회하면서 각연락처의 ID, 이름, 전화번호, 이메일, 프로필 이미지 URI를 익어온다

읽어온 값들을 User객체로 생성하고 전체 정보를 가지고 있는 UserList.UserList에 추가해준다

0개의 댓글