이것저것 다 개발

[Android] System Permission 본문

Android

[Android] System Permission

용용개발 2018. 4. 5. 18:30

Android 6.0(API 레벨 23) 부터 권한 부여 방식이 바뀌었습니다.

6.0 이전에는 앱 설치시 권한을 부여하지만 6.0 이후는 앱 실행시 권한을 요청합니다.

                

좌. 앱 다운로드 시 권한 요청                         우. 앱 실행 시 권한 요청

권한은 크게 Normal Permissions, Dangerous Permissions, Signature Permissions 3가지로 분류됩니다.


Normal Permissions 는 사용자의 개인 정보 보호 또는 기타 앱의 작동에 거의 영향을 미치지 않는 권한으로

권한을 부여하라는 메시지를 표시하지 않는 영역입니다.


Dangerous Permissions 는 사용자의 개인 정보와 관련된 데이터 또는 리소스를 원하거나 저장된 데이터, 다른 앱의

작동에 잠재적으로 영향을 줄 수 있는 영역입니다. 승인하지 않으면 해당 권한에 의존하는 기능을 제공 할 수 없습니다.


Signature Permissions 는 동일한 인증서로 서명 된 프로그램에게 권한을 부여합니다.


모든 Permission(Normal, Dangerous)은 AndroidMenifest.xml 에 선언하고 Dangerous Permission은 앱 실행 중 

명시적으로 승인 요청되어야 합니다.


대부분의 앱들은 permission에 대한 승인이 필요하기 때문에 저는 PermissionUtil 이라는 클래스를 만들고

가져다 쓰고 있습니다.

package kr.co.yongyi.test.util

import android.Manifest
import android.app.Activity
import android.content.pm.PackageManager
import android.support.v4.app.ActivityCompat
import android.support.v4.content.ContextCompat
import android.util.Log

/**
* Created by yongyi on 2018-03-21.
*/
class PermissionUtil {

// 앱에 필요한 Dangerous Permission 나열
private var permissions = arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_FINE_LOCATION)

// Dangerous Permission Request Code 나열 (임의지정)
private val PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 100
private val PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 101
private val PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 200

private var permissionCodes = arrayOf(
PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE,
PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE,
PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION
)

// Permission Check method
fun checkPermission(activity: Activity) {
// 나열해둔 permission check loop
for (permission in permissions) {
val permissionCheck = ContextCompat.checkSelfPermission(activity, permission)
// 권한 요청 승인시 return 0, 거부시 return -1
Log.d("PermissionUtil", "PERMISSION :: $permission / $permissionCheck")
// permission check 후 denied 상태인 permission만 다시 승인 요청
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
// denied 된 permission 승인 요청 loop
for (code in permissionCodes) {
// request permission
ActivityCompat.requestPermissions(activity, permissions, code);
}
Log.d("PermissionUtil", "$permission :: permission denied")
} else {
Log.d("PermissionUtil", "$permission :: permission granted")
}
}
}

// Override onRequestPermissionsResult()

}

permission check 후 onRequestPermissionsResult()를 Override하여 처리해주어야 하지만...흠..

var permissionUtil = PermissionUtil()
//permission check
if (Build.VERSION.SDK_INT >= 23) {
permissionUtil.checkPermission(this)
}

위와 같은 방식으로 Activity onCreate()에서 사용합니다.

이상입니다.


## 위 코드는 코틀린으로 코딩된 소스입니다 ##

Comments