이 글은 이것이 안드로이드다 with 코틀린(개정판)를 참고하여 작성하였습니다.
작성자 : 임나경
개발환경은 Windows, Android Studio입니다.

1. 권한처리 Permission
일반 권한과 위험 권한으로 나눌 수 있다.
위험 권한은 개인 정보를 앱이 필요로 할 때 사용자에게 한번 더 물어보는 과정을 거친다. (ex) 카메라 권한)

<AndroidManifest.xml>에 아래 두 줄을 추가한다.
<!-- 일반 권한 : manifest에 명세 해주는 것만으로 사용 가능-->
<uses-permission android:name="android.permission.INTERNET"/>
<!--위험 권한 : manifest에 명세하고, 코드에서도 한번 더 확인해야 사용 가능 (개인 정보와 관련된 권한은 모두 위험 권한)-->
<uses-permission android:name="android.permission.CAMERA"/>
<AndroidManifest.xml> 전체 코드는 다음과 같다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.basiclayout">
<!-- 일반 권한 : manifest에 명세 해주는 것만으로 사용 가능-->
<uses-permission android:name="android.permission.INTERNET"/>
<!--위험 권한 : manifest에 명세하고, 코드에서도 한번 더 확인해야 사용 가능 (개인 정보와 관련된 권한은 모두 위험 권한)-->
<uses-permission android:name="android.permission.CAMERA"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.BasicLayout">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
2. 뷰바인딩 설정
버튼을 클릭했을 때 동작을 하게 하기 위해서. 버튼에 access 하기 위해서 설정해주어야 한다.
<build.gradle>
buildFeatures {
viewBinding true
}
3. 위험권한 코드 설정
<MainActivity.kt> 기본 틀
package com.example.basiclayout
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.CompoundButton
import com.example.basiclayout.databinding.ActivityMainBinding
import kotlin.concurrent.thread
class MainActivity : AppCompatActivity() {
val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
}
}
<activity_main.xml>

<MainActivity.kt>
package com.example.basiclayout
import android.Manifest
import android.app.Activity
import android.content.pm.PackageManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.CompoundButton
import android.widget.SeekBar
import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.example.basiclayout.databinding.ActivityMainBinding
import kotlin.concurrent.thread
class MainActivity : AppCompatActivity() {
val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
binding.btnCamera.setOnClickListener{
checkPermission()
}
}
// 권한 확인 함수
fun checkPermission() {
// 카메라 승인 상태 가져오기
val cameraPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
if (cameraPermission == PackageManager.PERMISSION_GRANTED) {
// 승인된 상태
openCamera()
} else {
// 승인 안된 상태
requestPermission()
}
}
fun openCamera() {
Toast.makeText(this, "카메라를 실행합니다.", Toast.LENGTH_SHORT).show()
}
fun requestPermission() {
// 실제 권한 요청
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), 99) // 이미 만들어져있는 함수
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when(requestCode){
99 -> {
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
openCamera()
} else{
Toast.makeText(this, "권한을 승인하지 않으면 앱이 종료됩니다.", Toast.LENGTH_SHORT).show()
finish()
}
}
}
}
}


'GDSC HUFS 3기 > Android with Kotlin Team 2' 카테고리의 다른 글
| [2팀]14-9,10 화면 구성하기: 탭메뉴 뷰페이저와 프래그먼트 & 리사이클러 뷰 어댑터 (0) | 2021.11.09 |
|---|---|
| [2팀]15-2 BaseActivity 설계하기 (0) | 2021.11.09 |
| [2팀] 31 - 화면 구성하기: 프래그먼트 (0) | 2021.11.05 |
| [2팀] 27 - entry point, 액티비티값 주고받기 (0) | 2021.11.03 |
| [2팀] Ind 30 화면 구성하기: 리사이클러뷰(RecylerView) (0) | 2021.11.03 |