외로운 Nova의 작업실

안드로이드 앱 프로그래밍 - 9(퍼미션 설정하기) 본문

Programming/Kotlin - Android

안드로이드 앱 프로그래밍 - 9(퍼미션 설정하기)

Nova_ 2023. 1. 16. 14:22

- permission

퍼미션이란앱의 특정 기능에 부여하는 접근 권한을 말합니다. 내가 개발하는 앱이 다른 앱이나 안드로이드 시스템에서 보호하는 특정 기능을 이용할때 퍼미션(uses-permission) 사용을 설정해야합니다. 또한 내가 개발한 앱의 기능을 다른 사람과 공유할려면 퍼미션(permission) 기능을 허용해야합니다.

 

- 안드로이드 시스템 특정 권한 사용하기

minifast 파일이란 앱의 설정관련한 파일로 안드로이드 시스템의 특정 기능을 이용하려면 해당 파일에 해당 기능을 사용하겠다고 선언해줘야합니다. 카메라 사용을 예시로 들어보겠습니다. 아래는 manifest 파일입니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <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.AndroidLab">
        <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>

            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
    </application>
    <uses-permission android:name="android.permission.CAMERA"/>

</manifest>

하단에 <uses-permission ~ >을 선언해줘야합니다. name의 경우에는 퍼미션을 구별하는 식별자로 android의 권한중 CAMERA 권한을 요청하는 코드입니다. 안드로이드 시스템의 식별자 종류는 아래와 같습니다.

  • ACCESS_FINE_LOCATION : 위치 정보 접근
  • ACCESS_NETWORK_STATE : 네트워크 정보 접근
  • ACCESS_WIFI_STATE : 와이파이 정보 접근
  • BATTERY_STATS : 배터리 정보 접근
  • BLUETOOTH : 블루투스 장치에 연결
  • BLUETOOTH_ADMIN : 블루투스 장치를 검색하고 페어링
  • CAMERA : 카메라 장치에 접근
  • INTERNET : 네트워크 연결
  • READ_EXTERNAL_STORAGE : 외부 저장소에서 파일 읽기
  • WRITE_EXTERNAL_STORAGE : 외부 저장소에 파일 쓰기
  • READ_PHONE_STATE : 전화기 정보 접근
  • SEND_SMS : 문자 메시지 발신
  • RECEIVE_SMS : 문자 메시지 수신
  • RECEIVE_BOOT_COMPLETED : 부팅완료시 실행
  • VIBRATE : 진동울리기

권한 사용을 하겠다고 선언 한 후에는 사용자에게 권한 허용요청을 해야합니다. 이는 requestPermissions 함수로 진행합니다. 그전에 사용자가 권한을 거부했는지 허용했는지 체크해줘야합니다. 이는 ContextCompat.checkSelfPermission 함수로 진행합니다.

package com.example.stopwatch

import android.content.pm.PackageManager
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.example.stopwatch.databinding.ActivityMainBinding


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val status = ContextCompat.checkSelfPermission(this, "android.permission.CAMERA")
        if(status == PackageManager.PERMISSION_GRANTED){
            Log.d("log","permission granted")

        } else{
            ActivityCompat.requestPermissions(this, arrayOf<String>("android.permission.CAMERA"), 100)
        }
    }


}

이후 사용자가 퍼미션을 허용했는지 안했는지는 onRequestPermissionResult() 함수로 알 수 있습니다. 이 함수는 퍼미션 요청 다이얼로그가 닫힐때 자동으로 호출되어 코드상에서는 override만 해주면됩니다.

package com.example.stopwatch

import android.content.pm.PackageManager
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.example.stopwatch.databinding.ActivityMainBinding


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val status = ContextCompat.checkSelfPermission(this, "android.permission.CAMERA")
        if(status == PackageManager.PERMISSION_GRANTED){
            Log.d("log","permission granted")

        } else{
            ActivityCompat.requestPermissions(this, arrayOf<String>("android.permission.CAMERA"), 100)
        }
    }
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
            Log.d("log","permission granted")
        } else{
            Toast.makeText(applicationContext,"해당 권한을 허용해주셔야 앱 사용이 가능합니다.", Toast.LENGTH_SHORT).show()
            ActivityCompat.requestPermissions(this, arrayOf<String>("android.permission.CAMERA"), 100)
            Log.d("log","permission denied")
        }
    }


}

아래는 실행 화면입니다.

 

- 사용자가 2번 거부할경우

사용자가 특정 권한에 관해 거부를 두번 이상 탭하면 앱에서 그 권한을 다시 요청할경우 요청 다이얼이 생성되지 않습니다. 이를 바꿔주려면 권한 부분에서 항상 확인으로 변경해줘야합니다.

Comments