Android

[Android 2-1] 권한

연나연 2024. 1. 24. 16:32

권한

안드로이드는 개인 정보, 센서, 카메라, 저장소 등 개인 정보와 관련된 기능을 사용하기 위해서는 권한을 등록해야 한다.
권한 등록은 사용자가 애플리케이션을 다운로드 받거나 설치 후 애플리케이션 정보에서 확인이 가능하다.
권한 등록의 목적은 사용자에게 애플리케이션이 어떠한 기능을 사용하는지 알려주는 목적으로 사용한다.

권한 등록을 필요로 하는 기능을 사용할 때 권한을 등록하지 않으면 오류가 발생하여 개발자는 반드시 권한을 등록해야 하고 등록된 권한은 사용자에게 고지된다.

안드로이드 6.0 (마시멜로우) 버전 부터 개인 정보와 관련된 권한은 애플리케이션 내부에서 고지하고 사용 허가를 받아야 한다.
권한 사용시 반드시 사용자에게 고지하고 이를 승인 받는 작업이 필요하다.
사용 허가를 받을 필요 없는 권한은 사용 허가를 받은 상태로 처리된다.

 

그럼 실습해보자 !

1. ▼ AndroidManifest.xml

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

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Android24_Permission"
        tools:targetApi="31">
        <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>

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>​

 
기존 AndroidManifest.xml 에 다음 권한을 추가해줬다.


2. ▼activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textAppearance="@style/TextAppearance.AppCompat.Large" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="권한 확인" />
</LinearLayout>


3. ▼MainActivity.kt

package kr.co.lion.android24_permission

import android.Manifest
import android.content.pm.PackageManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kr.co.lion.android24_permission.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    // 확인할 권한의 목록
    val permissionList = arrayOf(
        Manifest.permission.INTERNET,
        Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.ACCESS_COARSE_LOCATION,
        Manifest.permission.READ_CONTACTS,
        Manifest.permission.WRITE_CONTACTS,
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
    )

    lateinit var activityMainBinding : ActivityMainBinding

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

        activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(activityMainBinding.root)

        // 권한을 확인한다.
        requestPermissions(permissionList,0)

        activityMainBinding.apply {
            button.setOnClickListener {
                // 위치 사용 권한 확인
                val chk1 = checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION)
                if(chk1 == PackageManager.PERMISSION_GRANTED){
                    textView.text = "위치 권한이 허용되어 있습니다. \n"
                } else if(chk1 == PackageManager.PERMISSION_DENIED){
                    textView.text = "위치 권한이 허용되어 있지 않습니다. \n"
                }

                // 연락처 권한
                val chk2 = checkSelfPermission(Manifest.permission.READ_CONTACTS)
                if(chk2 == PackageManager.PERMISSION_GRANTED){
                    textView.append("연락처 권한이 허용되어 있습니다. \n")
                } else if(chk2 == PackageManager.PERMISSION_DENIED){
                    textView.append("연락처 권한이 허용되어 있지 않습니다. \n")
                }
            }
        }
    }
}


4. ▼ 결과 확인

이런식으로 연락처와 위치 각각을 허용하겠냐는 안내창이 뜬다 !
직접 디바이스 설정 -> 해당 앱 에 들어가서 허용 및 허용취소 할 수 있음

기본 화면

권한 확인 버튼을 클릭한다 (나 같은 경우, 권한 허용하지 않았음 !)

다음과 같이 textView가 바뀜 ~

학습정리

안드로이드는 제공되는 기능 중 권한을 등록해야 사용할 수 있는 기능들이 있다.

안드로이드 6.0(마시멜로우) 버전 부터는 애플리케이션 내부에서 권한 사용을 고지하고 사용 허가를 받아야 하는 처리가 추가되었다.