GDSC HUFS 3기/Android with Kotlin Team 2

[2팀]15 권한처리 Permission

NakyungIm 2021. 11. 8. 21:03

이 글은 이것이 안드로이드다 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()
                }
            }
        }
    }
}

 

결과화면1
결과화면2