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 {
}
}
권한이 거부되었다면 해당 기능을 이용하지 못하도록 한다.
<uses-permission android:name="android.permission.READ_CONTACTS" />
if(requireActivity().checkSelfPermission(Permissions.CONTACT_PERMISSION[0]) == PERMISSION_DENIED) {
requestPermissionLauncher.launch(Manifest.permission.READ_CONTACTS)
} else {
Log.d("LoadContactDialog", "Permission is already Granted.")
dismiss()
}
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()
}