AndroidManifest.xml
<manifest ...>
<uses-permission android:nam"android:permission.CAMERA"/>
// 위치 권한도 설정할 경우
<uses-permission android:nam"android:permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:nam"android:permission.ACCESS_COARSE_LOCATION"/>
MainActivity.kt
class MainActivity: AppCompatActivity() {
private val cameraResultLauncher: ActivityResultLauncher<String> =
registerForActivityResult(
ActivityResultContracts.RequestPermission()){
isGranted ->
if (isGranted) {
// Granted
}else{
// Denied
}
}
// 여러 권한 요청
private val cameraAndLocationResultLauncher: ActivityResultLauncher<Array<String>> =
registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()){
// permissions에는 문자열(권한 이름), Boolean (승인여부)
permissions ->
permissions.entries.forEach{
val permissionName = it.key
val isGranted = it.value
if (isGranted) {
if (permissionName == Manifest.permission.ACCESS_FINE_LOCATION) {
// Granted for FINE location
}else if (permissionName == Manifest.permission.ACCESS_COARSE_LOCATION) {
// Granted for Coarse Location
}
else{
// Granted for Camera
}
}else{
if (permissionName == Manifest.permission.ACCESS_FINE_LOCATION) {
// Denied for location
}else if (permissionName == Manifest.permission.ACCESS_COARSE_LOCATION) {
// Denied for Coarse Location
}else{
// Denied for Camera
}
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val btnCameraPermission: Button = findViewById(R.id.btnCameraPermission)
btnCameraPermission.setOnClickListener{
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M &&
shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)){
showRationaleDialog("카메라 접근 허용이 필요합니다", "카메라 접근 허용이 거부되어, 카메라를 사용할 수 없습니다.")
}else{
//단일 권한일 경우 cameraResultLauncher.launch(Manifest.permission.CAMERA)
// 여러개의 권한
cameraResultLauncher.launch(
arrayOf(Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
}
}
private fun showRationaleDialog(
title: String,
message: String,
) {
val builder: AlertDialog.Builder = AlertDialog.Builder(this)
builder.setTitle(title).setMessage(message)
.setPositiveButton("Cancel"){dialog, _ ->
dialog.dismiss()
}
builder.create().show()
}
btn_camera.setOnClickListener{
if (ContextCompat.checkSelfPermission(
this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(intent, CAMERA_REQUEST_CODE)
}else{
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), CAMERA_PERMISSION_CODE)
}
}
}
override fun onRequestPermissionsResult(requestcode: Int, permissions: Array<out String>, grantResults: IntArray){
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == CAMERA_PERMISSION_CODE){
if(grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED){
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(intent, CAMERA_REQUEST_CODE)
}else{
Toast.makeTest(this, "카메라 접근이 거부되었습니다. 접근 권한 변경은 설정에서 할 수 있습니다.", Toast.LENGTH_LONG).show()
}
}
}
// 사용자가 카메라로 이미지를 선택하면 자동으로 불러지는 메소드
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(resultCode == Activity.RESULT OK) {
if(requestCode == CAMERA_REQUEST_CODE){
// 불러온 이미지를 이미지 변수에 저장
val thumbNail: Bitmap = data!!.extras!!.get("data") as Bitmap.
iv_image.setImageBitmap(thumbNail)
}else{
}
}
}
}
class MainActivity: AppCompatActivity() {
companion object{
private const val CAMERA_PERMISSION_CODE = 1
private const val CAMERA_REQUEST_CODE = 2
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btn_camera.setOnClickListener{
if (ContextCompat.checkSelfPermission(
this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(intent, CAMERA_REQUEST_CODE)
}else{
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), CAMERA_PERMISSION_CODE)
}
}
}
override fun onRequestPermissionsResult(requestcode: Int, permissions: Array<out String>, grantResults: IntArray){
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == CAMERA_PERMISSION_CODE){
if(grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED){
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(intent, CAMERA_REQUEST_CODE)
}else{
Toast.makeTest(this, "카메라 접근이 거부되었습니다. 접근 권한 변경은 설정에서 할 수 있습니다.", Toast.LENGTH_LONG).show()
}
}
}
// 사용자가 카메라로 이미지를 선택하면 자동으로 불러지는 메소드
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(resultCode == Activity.RESULT OK) {
if(requestCode == CAMERA_REQUEST_CODE){
// 불러온 이미지를 이미지 변수에 저장
val thumbNail: Bitmap = data!!.extras!!.get("data") as Bitmap.
iv_image.setImageBitmap(thumbNail)
}else{
}
}
}
}