글 목차
728x90
권한 설정을 받는 앱을 만들어 본다.
1. 권한 설정을 받기 위한 기능을 담당하는 BaseActivity Class(abstract)를 만들어서 MainActivity가
상속하게 만든다.
2. Base Acitivy에 작성할 코드는 다음과 같다.
a) 권한을 요구하는 함수 requirePermission
b) 권한이 승인되거나 거부되었을 때 작동할 함수 onRequestPermissionResult(override)
c) 권한이 승인되었을 때 작동할 함수 permissionGranted(abstract)
d) 권한이 거부되었을 때 작동할 함수 permissionDenied(abstract)
3. MainActivity에서 적절한 곳에 requirePermission을 호출
4. permissionGranted와 permissionDenied 구현
0. 뷰 바인딩, 권한 설정을 함
<uses-permission android:name="android.permission.CAMERA"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
1. BaseAcitivy
package com.example.myapplication
import android.content.pm.PackageManager
import android.os.Build
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import java.util.Arrays
abstract class BaseActivity: AppCompatActivity() {
abstract fun permissionGranted(requestCode: Int)
abstract fun permissionDenied(requestCode: Int)
fun requirePermission(permissions: Array<String>, requestCode: Int) {
Log.d("ggg", Arrays.toString(permissions)) // [android.permission.READ_EXTERNAL_STORAGE]
if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
permissionGranted(requestCode)
} else {
ActivityCompat.requestPermissions(this, permissions, requestCode)
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (grantResults.all { it == PackageManager.PERMISSION_GRANTED }) {
permissionGranted(requestCode)
} else {
permissionDenied(requestCode)
}
}
}
2. MainAcitivity
package com.example.myapplication
import android.Manifest
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.MediaStore
import android.widget.Toast
import com.example.myapplication.databinding.ActivityMainBinding
class MainActivity : BaseActivity() {
val binding by lazy { ActivityMainBinding.inflate(layoutInflater)}
val PERM_CAMERA = arrayOf(Manifest.permission.CAMERA)
val PERM_STORAGE = arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE)
val REQ_STORAGE = 99
val REQ_CAMERA = 100
val TAKE_CAMERA = 101
override fun permissionGranted(requestCode: Int) {
when(requestCode) {
REQ_STORAGE -> {
Toast.makeText(this, "스토리지 권한이 승인 되었습니다.", Toast.LENGTH_SHORT).show()
}
REQ_CAMERA -> {
openCamera()
}
}
}
override fun permissionDenied(requestCode: Int) {
when(requestCode) {
REQ_STORAGE -> {
Toast.makeText(this, "스토리지 권한이 거부되었습니다..", Toast.LENGTH_SHORT).show()
finish()
}
REQ_CAMERA -> {
Toast.makeText(this, "카메라 권한이 거부되었습니다..", Toast.LENGTH_SHORT).show()
}
}
}
fun openCamera() {
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(intent, TAKE_CAMERA)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(resultCode == RESULT_OK) {
when(requestCode) {
TAKE_CAMERA -> {
Toast.makeText(this, "촬영을 하면 여기로 와요.", Toast.LENGTH_SHORT).show()
}
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
requirePermission(PERM_STORAGE, REQ_STORAGE)
binding.btnCamera.setOnClickListener {
requirePermission(PERM_CAMERA, REQ_CAMERA)
}
}
}
728x90