목적

앱 내부에서 갤러리에 저장되어 있는 사진을 이용케 함

 

 

기능구현

1. 앱에 권한이 부여되었는지 확인

 

2. 사용자가 이미 앱에 특정 권한을 부여했는지 확인하려면

ContextCompat.checkSelfPermission() 메서드에 권한을 전달합니다.

 

3. 앱에 권한이 있는지에 따라

PERMISSION_GRANTED 또는 PERMISSION_DENIED를 반환합니다.

 

3-1.

PERMISSION_GRANTED → 권한 부여 O

PERMISSION_DENIED → 권한 부여 X

 

4. PERMISSION_DENIED를 반환하면 shouldShowRequestPermissionRationale()을 호출

 

5. 사용자가 사용 설정하려는 기능에 특정 권한이 필요한 이유를 설명합니다.

 

5-1.

requestPermissions()를 호출하면 시스템에서 표시하는 권한 대화상자에 앱에서 원하는 권한이

무엇인지 표시 (팝업으로 설명)

 

6. requestPermissions()를 호출하기 전에 앱에서 권한을 요청하는 이유를 사용자에게 설명하는 것이 좋습니다.

 

 

요약

  1. 앱 특정권한 부여 확인
  2. 팝업 이후 권한을 요청 이유 설명

 

 

Android에서 런타임 권한을 선언하고 요청하는 워크플로를 보여 주는 다이어그램

 

 

AndroidManifest.xml

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

    <uses-permission android:name="android.Manifest.permission.READ_EXTERNAL_STORAGE"/>

    <application  
        <activity>
        </activity>
    </application>

</manifest>
 

앱이 올바르게 작동하기 위해 사용자가 반드시 부여해야 하는 시스템 권한

 

Manifest

  • 스타일 및 테마를 변경할 수 있다.
  • 시작 Activity를 변경할 수 있다.
  • 아이콘 및 레이블을 변경할 수 있다.
  • 권한을 요청할 수 있다.

EX) 카메라, 인터넷, 갤러리, 위치

 

 

import android.content.pm.PackageManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AlertDialog
import androidx.core.content.ContextCompat

class MainActivity : AppCompatActivity() {

    private val add : Button by lazy {
        findViewById(R.id.add)
    }

    private val start : Button by lazy {
        findViewById(R.id.start)	
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //권한을 받기 위한 메소드 호출
        initadd()
    }

//코드 추상화 : 같은 기능을 메소드로 감싸서 init을 하면 구별하기 쉽다 
    private fun initadd() {
        //[추가] 버튼을 눌렀을 시 권한 확인, add 버튼을 눌렀을 시
        add.setOnClickListener {
            when {
//특정 권한이 부여 되어있는지 확인.
//첫 번째 인자는 Context(this), 두번째 인자는 권한 받아야할 종류
                ContextCompat.checkSelfPermission(
                    this,
                    android.Manifest.permission.READ_EXTERNAL_STORAGE
                ) == PackageManager.PERMISSION_GRANTED -> {
                    //You can use the API that requires the permission.
                }
                //권한 받아야할 종류(Permission) = android.Manifest.permission.READ_EXTERNAL_STORAGE
                shouldShowRequestPermissionRationale(android.Manifest.permission.READ_EXTERNAL_STORAGE) -> {
           //권한 팝업 띄우는 기능
            AlertDialog.Builder(this)
            .setTitle("We need Permission")
            .setMessage("For Photo")
            .setPositiveButton("agree") { _, _ ->
               requestPermissions(arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), 1000)
           }
           .setNegativeButton("cancle") { _, _ ->}
           .create()
           .show()
                }

                else -> {
                    //권한요청 팝업
                    requestPermissions(arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), 1000)
                }
            }
        }
    }

}
 

 

 

결과 화면

 

 
00:18
 

 

 

 

 

 

 

 

 

https://developer.android.com/training/permissions/requesting?hl=ko

 

앱 권한 요청  |  Android 개발자  |  Android Developers

앱 권한 요청 모든 Android 앱은 액세스가 제한된 샌드박스에서 실행됩니다. 앱이 자체 샌드박스 밖에 있는 리소스나 정보를 사용해야 하는 경우 권한을 선언하고 이 액세스를 제공하는 권한 요청

developer.android.com

 

https://www.youtube.com/watch?time_continue=200&v=x38dYUm7tCY&feature=emb_logo

 

'Android-Kotlin📱' 카테고리의 다른 글

코틀린 뷰바인딩 Kotlin ViewBinding  (0) 2022.05.15
Kotlin Retrofit  (0) 2022.05.09
Kotlin Collection (코틀린 Collection)  (0) 2022.03.30
Android Studio 내 스마트폰 연결, USB 디버깅  (0) 2022.03.29
Kotlin Dependencies  (0) 2022.03.27
복사했습니다!