๋ชฉ์ฐจ
๋ค์ด๊ฐ๊ธฐ ์ ์
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ์ฌ์ฉ์์ ์์น๋ฅผ ์ธก์ ํ๋ ๊ธฐ๋ฅ์์๋ ์์น ๊ถํ ์์ฒญ์ด๋ผ๋ ๊ถํ์ด ํ์ํ๋ค.
์ฒ์์๋ ๊ถํ ์์ฒญ์ ๋ํด ๋์๋กญ์ง ์๊ฒ ์ฌ๊ฒผ๋๋ฐ, ๊ถํ์ ์ ๋๋ก ์ค์ ํด์ฃผ์ง ์์ผ๋ฉด ๊ธฐ๋ฅ์ด ์ ์์ ์ผ๋ก ์๋ํ์ง ์์๋ค.
์์น๊ฐ ์ ๋๋ก ๋ฐ์์์ง์ง ์์์ ๊ณจ์น๊ฐ ์ํ ๋๋ฐ ๊ฒฐ๊ตญ ๋์ค์ ๋ณด๋ ๊ถํ ์ด๋ ์์ด ๋ฌธ์ ์๋ค!!!!
์์ผ๋ก๋ ํ์์ ์ผ๋ก ์์์ผํ ์ฌํญ์ด๋ ์ ๋๋ก ์ ๋ฆฌํ๊ณ ๋์ด๊ฐ๋ ค๊ณ ํ๋ค!!!
๊ถํ์ด๋?
๋จผ์ ๊ถํ์ด ๋ฌด์์ ๋งํ๋ ๊ฑธ๊น?
์ฑ์ ์ค์นํด์ ๋ค์ด๊ฐ๋ คํ๋ฉด ์ฌ๋ฌ๊ฐ์ง ์ฐฝ์ด ๋จ๋ฉด์ ~ํ์ฉํ์๊ฒ ์ต๋๊น? ๋ผ๋ ๋ฉํธ๋ฅผ ์์ฃผ ๋ณธ ๊ธฐ์ต์ด ์์ํ ๋ฐ ๋ฐ๋ก ์ฌ๊ธฐ์ ํ์ฉ/๊ฑฐ๋ถ์ ๋ํด ๋ฌป๋ ๊ฒ์ด ์ค๋ ๋ค๋ฃฐ ๊ถํ์ด๋ค!
์ ํํ ๋งํ์๋ฉด ๊ถํ์ ์ฌ์ฉ์์ ๋ฏผ๊ฐํ ์ ๋ณด์ ์ ๊ทผํ๋ ๊ฒ์ ์ ํํ๊ณ ์ฑ์ด ์ด๋ค ์ ๋ณด์ ์ ๊ทผํ๋์ง ๋ช ํํ๊ฒ ์ ์ ์๊ฒ ํด์ฃผ์ด ์ธ์ง๋๋ฅผ ๋์ฌ์ฃผ๋ ์ญํ ์ ํ๋ค.
๋ฒ์ ๋ณ๋ก ํ์ํ ๊ถํ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ฐ๋ผ ํ์ํ ๊ถํ์ ์ถ๊ฐํด์ ์ฌ์ฉํด์ผํ๋ค.
๊ถํ์ ์ข ๋ฅ
๊ถํ์ 2๊ฐ์ง ์ข ๋ฅ๋ก ๋๋๋ค.
1. Install-time
์ฑ์ ์ค์นํ ๋ ์๋์ผ๋ก ๋ถ์ฌ๋๋ ๊ถํ์ด๋ค. ์ฌ์ฉ์์๊ฒ ๋ณ๋์ ํ๊ฐ๋ฅผ ์์ฒญํ์ง ์์๋ ๋๋ค. ์๋ฅผ ๋ค์ด ์ธํฐ๋ท ์ ๊ทผ ๊ถํ์ด ์ฌ๊ธฐ์ ํด๋นํ๋ค. ์ด๋ฌํ ๊ถํ์ ์ฌ์ฉ์์ ๊ฐ์ธ์ ๋ณด์ ์ง์ ์ ์ธ ์ํ์ ์ฃผ์ง ์๋ ๊ธฐ๋ฅ๋ค์ ๋ํ ์ ๊ทผ์ ํ์ฉํ๋ค.
2. Runtime
์ฑ์ด ์คํ ์ค์ผ ๋ ์ฌ์ฉ์์๊ฒ ์ง์ ์์ฒญํด์ผํ๋ ๊ถํ์ด๋ค. ์ฃผ๋ก ์ฌ์ฉ์์ ๊ฐ์ธ ์ ๋ณด์ ๊ด๋ จ๋ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ์ ์ ๊ทผํ ๋ ํ์ํ๋ค.
๊ถํ ์์ฒญ ๊ณผ์
๊ถํ ๊ฒ์ฌํ๊ธฐ
1. ์ฐ์ ์ด๋ฏธ ๊ถํ์ด ๋ถ์ฌ๋์๋์ง ํ์ธํด์ผํ๋ค.
์ฑ์ ์ต์ ์์ ์์๋ ๋น์ฐํ ๊ถํ ์์ฒญ์ ๋ฐ๋ก ํด๋ ๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ค์๋ถํฐ๋ ๊ถํ์ด ์๋์ง ์ด๋ป๊ฒ ๊ฒ์ฌํ ๊น?
์ด ๋๋ ContextCompat.checkSelfPermission(Context, ๊ถํ)์ ํตํด ๊ถํ์ ์ ๋ฌํ์ฌ ๋ฐํ๊ฐ์ ์ป์ ์ ์๋ค.
์ด ๋ฐํ๊ฐ๊ณผ PackManager.PERMISSION.GRANTED์ ๋น๊ตํด์ฃผ๋ฉด ๋๋ค.
- ๋ง์ฝ ๊ถํ์ด ์ด๋ฏธ ํ์ฉ๋์ด์๋ค๋ฉด ContextCompat.checkSelfPermission(Context, ๊ถํ) ๋ PERMISSION.GRANTED๋ฅผ ๋ฐํํด์ ์กฐ๊ฑด์ ์ฐธ์ด ๋๋ค.
- ๋ง์ฝ ๊ถํ์ด ์๋ค๋ฉด ๊ฑฐ์ง์ธ ๊ฒฝ์ฐ ContextCompat.checkSelfPermission(Context, ๊ถํ) ๋ PERMISSION_DENIED๋ฅผ ๋ฐํํด์ ์กฐ๊ฑด์ ๊ฑฐ์ง์ด ๋๊ณ , ์ด ๋ ์์น ๊ถํ์ ์์ฒญํด์ฃผ๋ฉด ๋๋ค.
์ฑ์์ ๊ถํ์ด ํ์ํ ์ด์ ๋ฅผ ์ค๋ช ํ๊ธฐ
๋ง์ฝ ์ ๊ณผ์ ์์ ๊ถํ์ด ์์ง ๋ถ์ฌ๋์ด์์ง ์๋ค๋ฉด ์ฌ์ฉ์๊ฐ ํด๋น ๊ถํ์ ํ์ฉํ๊ธฐ ์ํด์ ํด๋น ๊ถํ์ด ํ์ํ ์ด์ ๋ฅผ ์ค๋ช ํด์ฃผ๋ฉด ์ข๋ค.
shouldShowRequestPermissionRationale()๋ฅผ ํธ์ถํ์ฌ ์ด ์ฑ์์ ํด๋น ๊ถํ์ด ํ์ํ ์ด์ ๋ฅผ ์ฌ์ฉ์์๊ฒ ์ค๋ช ํ๊ฑฐ๋ ๋ฐ๋ก ๊ถํ์ ์์ฒญํ ์ ์๋ค
๊ถํ ์์ฒญ
์ค๋ช ์ ํ๊ณ ์ฌ์ฉ์๊ฐ ๋์ํ ๊ฒฝ์ฐ ๊ถํ์ ์์ฒญํ ์ ์๋ค. ์์์ ์ดํด๋ณธ install-in ๊ถํ๊ณผ runtime ๊ถํ์ ์์ฒญ๋ฐฉ๋ฒ์ด ์กฐ๊ธ ๋ค๋ฅด๋ค.
์ฐ์ ๊ณตํต์ ์ผ๋ก ๋ ๊ถํ ๋ชจ๋ ๋งค๋ํ์คํธ ํ์ผ์์ ํ์ํ permission์ ๋ช ์ํด์ค๋ค.
๋๋ ์น ์๋ฒ์ ํต์ ํ๊ธฐ ๋๋ฌธ์ ์ธํฐ๋ท ๊ถํ์ ํ์ฉํด์ฃผ์ด์ผํ๋ค. ๊ทธ๋์ ์๋์ ๊ฐ์ด ๋งค๋ํ์คํธ์ ์ธํฐ๋ท ๊ถํ์ ํ๊ฐํด์ฃผ์๋ค.
<uses-permission android:name="android.permission.INTERNET" />
๋ํ ์์น๋ฅผ ์ฌ์ฉํ ์ฌ์ฉ์์ ์์น ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด์ ์์น ๊ด๋ จ ๊ถํ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด ์์น ๊ด๋ จ ๊ถํ์ ์ถ๊ฐํด์ฃผ์๋ค.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
์ ๊ทธ๋ผ ๊ถํ ์์ฒญ ๋ ~?
install-time ๊ถํ์ ํ ์ข ๋ฅ์๋ ์ธํฐ๋ท ๊ถํ ์์ฒญ์ ๋งค๋ํ์คํธ์ ์ ์ธํด์ฃผ๋ ๊ฒ์ผ๋ก ๊ถํ ์์ฒญ์ด ์๋ฃ๋๋ค.
๊ทธ๋ฌ๋ runtime ๊ถํ์ ๊ฒฝ์ฐ ์ถ๊ฐ์ ์ธ ์์ ์ด ํ์ํ๋ค.
๊ถํ ์์ฒญ ๋ฐฉ๋ฒ
1. onRequestPermissionResult (deprecated) : ์ฒ์์๋ ์ด ๋ฐฉ์์ ์ฌ์ฉํ์ง๋ง ์ด์ deprecated๋์๋ค๊ณ ํ๋ค.
๊ทธ๋๋ ์๋ณด๋ฉด ์์ฌ์ฐ๋๊น onRequestPermissionResult ๋ฐฉ์๋ ๊ฐ๋จํ๊ฒ๋ง ์ฝ๋๋ฅผ ๋ณด์.
grantResults๊ฐ์ ํตํด ๊ถํ์ด ํ๊ฐ๋์๋์ง ๊ฑฐ๋ถ๋์๋์ง๋ฅผ ๊ฒ์ฌํด์ฃผ๊ณ ์ผ์ด์ค์ ๋ง๊ฒ ์ฝ๋๋ฅผ ์์ฑํด์ฃผ๋ฉด ๋๋ค.
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (grantResults[0] == PackManager.PERMISSION_GRANTED) {
// ๊ถํ์ด ํ๊ฐ๋ ๊ฒฝ์ฐ ๋์ ์ ์
}
else {
// ๊ถํ์ด ๊ฑฐ๋ถ๋ ๊ฒฝ์ฐ ๋์ ์ ์
}
}
์ ๋ฐฉ์์ deprecated๋ผ๋ฉด ์ด๋ป๊ฒ ๊ถํ์ ์์ฒญํด์ผํ๋์ !!?
2. registerForActivityResult(ActivityResultContracts.RequestPermission() ) ๋ฅผ ์ฌ์ฉํด์ฃผ๋ฉด ๋๋ค.
1. ์ฐ์ ๋ฐํ์ ๊ถํ ์์ฒญ์ด ํ์ํ ๊ถํ ๋ชฉ๋ก์ ๋ง๋ค์ด์ค๋ค.
private val permissionList = arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
)
๊ทธ๋ฆฌ๊ณ ๊ถํ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ต์ ์ฒ๋ฆฌํ๋ ๋ก์ง์ ์์ฑํด์ค๋ค.
private val requestPermissionResult = registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { permission ->
if (permission.all { it.value }) {
Log.d("๊ถํ ํ์ฉ", "${permission} ๊ถํ ํ์ฉ")
} else {
Log.d("๊ถํ ๊ฑฐ๋ถ", "$permission ๊ถํ ํ์ํฉ๋๋ค")
}
}
์ ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ์๋์ ์ฝ๋ ํ์ค๋ง ์์ฑํด์ฃผ๋ฉด ๊ถํ ์์ฒญ๊ณผ ์๋ต ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ค.
requestPermissionResult.launch(permissionList)
์ฝ๋๋ก ์์๋ณด๊ธฐ
1. ๊ถํ์ด ์ด๋ฏธ ๋ถ์ฌ๋์ด์๋์ง ์ฒดํฌํ๊ธฐ
2. ์๋ ๊ฒฝ์ฐ ๊ถํ์ ์์ฒญํ๋ ์ด์ ์ค๋ช ํ๊ธฐ
3. ๋์ํ ๊ฒฝ์ฐ ์์น ๊ถํ ์์ฒญํ๊ธฐ
private fun checkPermission() {
when {
permissionList.all { ContextCompat.checkSelfPermission(this,it) == PackageManager.PERMISSION_GRANTED }
-> {
Log.d("๊ถํ", "๋ชจ๋ ๊ถํ์ด ์ด๋ฏธ ๋ถ์ฌ๋์์ต๋๋ค.")
}
ActivityCompat.shouldShowRequestPermissionRationale(
this, Manifest.permission.ACCESS_FINE_LOCATION
) -> {
showPermissionContextPopup()
}
else -> {
requestPermissionResult.launch(permissionList)
}
}
}
private fun showPermissionContextPopup(){
androidx.appcompat.app.AlertDialog.Builder(this)
.setTitle("์์น ๊ถํ์ด ํ์ํฉ๋๋ค")
.setMessage("๊ทํ์ ์์ ์ ๋ณดํธํ๊ธฐ ์ํด ์์น ๊ถํ์ด ํ์ํฉ๋๋ค.")
// 3. ๋์ ๋ฒํผ ํด๋ฆญ ์ ์์น ๊ถํ ์์ฒญ
.setPositiveButton("๋์") {_,_ ->
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),0
)
}
.setNegativeButton("์ทจ์") {_,_ ->}
.create()
.show()
}
๊ฒฐ๊ณผ
'๐ค2024 ์๋๋ก์ด๋ > โ๏ธ ํ๊ณ ์ธํด ๊ฐ๋ฐ ํ๋ก์ ํธ ๊ธฐ๋ก' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Android : suspend function์ด๋? (1) | 2024.08.29 |
---|---|
Android : Handler ์ดํดํ๊ธฐ (0) | 2024.08.29 |
Android Thread (0) | 2024.08.19 |
๐ ํ๋ก์ ํธ ์๋ฃ ํ 4L ํ๊ณ (0) | 2024.08.19 |
๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ธก์ ํด๋ณด๊ธฐ (2) | 2024.08.14 |