Android) 연락처 가져오기

성승모·2024년 7월 24일
0

권한 요청

1. 권한 관련 권장사항
- 앱의 어떤 기능에 필요한 권한인지 설명해준다. -> shouldShowRequestPermissionRationale() 또는 커스텀 dialog 등을 이용
- 사용자가 권한 거부 시에 앱을 차단하지 않는다.
- 관련 권한을 이용할때마다 앱에서 확인을 해야한다. -> checkSelfPermission() 이용

2. 권한요청 과정

  • 필요한 권한을 AndroidManifest에 명시한다.

    <uses-permission android:name="android.permission.YOUR_PERMISSION_REQUEST" />
  • 현재 권한 상태를 확인한다.

    if(activity.checkSelfPermission(Manifest.permission.YOUR_PERMISSION_REQUEST) == PERMISSION_DENIED)
  • 위 결과가 false라면 권한을 요청한다.

registerForActivityResult(ActivityResultContracts.RequestPermission()
        ) { isGranted: Boolean ->
            if (isGranted) {
            	//Do what you want
            } else {
            
            }
        }
  • 권한이 거부되었다면 해당 기능을 이용하지 못하도록 한다.

    연락처 얻어오기

  1. 필요한 권한을 AndroidManifest에 명시
    <AndroidManifest.xml>
<uses-permission android:name="android.permission.READ_CONTACTS" />
  1. 현재 권한 상태 확인
    <LoadContactDialog.kt>
if(requireActivity().checkSelfPermission(Permissions.CONTACT_PERMISSION[0]) == PERMISSION_DENIED) {
    requestPermissionLauncher.launch(Manifest.permission.READ_CONTACTS)
} else {
    Log.d("LoadContactDialog", "Permission is already Granted.")
    dismiss()
}
  1. 결과가 false라면 권한을 요청
    <LoadContactDialog.kt>
private val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
            if (isGranted) {
                Log.d("LoadContactDialog", "Permission is Granted.")
                getContacts()
                dismiss()
            } else {
                Toast.makeText(requireContext(), getString(R.string.read_contact_reject_msg), Toast.LENGTH_SHORT).show()
                dismiss()
            }
    }

getContact()

private fun getContacts() {
        val resolver = requireContext().contentResolver
        val uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI

        val projection =
            arrayOf(
                ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                ContactsContract.CommonDataKinds.Phone.NUMBER
            )

        val sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE LOCALIZED ASC"
        val cursor = resolver.query(uri, projection, null, null, sortOrder)

        cursor?.let {
            val sizeContract = ContractObject.getContractListSize()
            var num = 0
            while(cursor.moveToNext()) {
                val nameIndex = cursor.getColumnIndex(projection[0])
                val numberIndex = cursor.getColumnIndex(projection[1])

                val name = cursor.getString(nameIndex)
                val number = cursor.getString(numberIndex)

                Log.d("LoadContactDialog", "$num: name: $name, number: $number")

                loadedContractList.add(
                    ContractData(
                        id = sizeContract+num,
                        profile = R.drawable.ic_account_circle,
                        userName = name,
                        phoneNumber = number,
                        affiliated = "",
                        sendNotificationSec = 10,
                        isFavorite = false
                    )
                )

                num++
            }

        }

        cursor?.close()
    }
profile
안녕하세요!

0개의 댓글