안드로이드

[안드로이드] 권한설정과 BaseActivity

2023. 5. 30. 11:03
글 목차


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
[안드로이드] 권한설정과 BaseActivity