프로그래밍/안드로이드

[안드로이드] Android 6.0 Marshmallow (마시멜로우)에서 권한 처리작업

오치리일상 2017. 8. 16.

목차

안드로이드가 최적화 단계를 거치며 업데이트 하면서 OS 버전 6.0 Marshmallow (마시멜로우)에서부터는 AndroidManifest.xml에 정의하는 권한을 사용자에게 동의를 받아야만 해당 기능을 사용할 수 있게 되었습니다.

 

 

 

 

 

그리하여 매니페스트에만 정의했던 permission(권한)을 사용자에게 동의 받는 절차를 코딩해봅니다.

 

 

 

기존에는 매니페스트에 아래와 같이 권한을 정의 했었습니다.

 

임의로 파일 읽기 권한과 파일 쓰기 권한을 요청합니다. 이렇게 권한을 선언하고 앱을 사용하면 되었습니다.

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

 

 

하지만 6.0 마시멜로우부터는 해당 권한이 필요한 곳에 권한 동의 메시지를 통해 권한사용을 동의 받아야 합니다.

 

여기서는 MainActivity 클래스에서 파일 읽기 권한과 파일 쓰기 권한을 요청하는 예제로 설명하겠습니다.

 

 

* MainActivity.java

 

package

com.studio572.samplerequestpermision

;

import

android.Manifest

;
import

android.app.AlertDialog

;
import

android.content.DialogInterface

;
import

android.content.pm.PackageManager

;
import

android.os.Build

;
import

android.support.v4.app.ActivityCompat

;
import

android.support.v4.content.ContextCompat

;
import

android.support.v7.app.AppCompatActivity

;
import

android.os.Bundle

;
import

android.util.Log

;

public class

MainActivity

extends

AppCompatActivity {

private final int PERMISSIONS_REQUEST_RESULT

=

100; // 콜백함수 호출시 requestCode로 넘어가는 구분자

@Override
protected void onCreate

(Bundle savedInstanceState) {

super

.onCreate(savedInstanceState)

;

setContentView(R.layout.

activity_main

)

;

requestPermissionCamera()

;

}

public boolean requestPermissionCamera

(){

int

sdkVersion = Build.VERSION.

SDK_INT;

// 해당 단말기의 안드로이드 OS버전체크
if

(sdkVersion >= Build.VERSION_CODES.

M

) {

// 버전 6.0 이상일 경우

// 해당 퍼미션이 필요한지 체크 - true : 퍼미션 동의가 필요한 권한일 때 , false : 퍼미션 동의가 필요하지 않은 권한일 때.
if

(ContextCompat.

checkSelfPermission

(

this,

Manifest.permission.

READ_EXTERNAL_STORAGE

) != PackageManager.

PERMISSION_GRANTED

|| ContextCompat.

checkSelfPermission

(

this,

Manifest.permission.

WRITE_EXTERNAL_STORAGE

) != PackageManager.

PERMISSION_GRANTED

) {

// true : 퍼미션 동의가 필요한 권한일 때

// 사용자가 최초 퍼미션 체크를 했는지 확인한다. - true : 사용자가 최초 퍼미션 요청시 '거부'했을 때, false : 퍼미션 요청이 처음일 경우
if

(ActivityCompat.

shouldShowRequestPermissionRationale

(

this,

Manifest.permission.

READ_EXTERNAL_STORAGE

)
|| ActivityCompat.

shouldShowRequestPermissionRationale

(

this,

Manifest.permission.

WRITE_EXTERNAL_STORAGE

)) {

// true : 사용자가 최초 퍼미션 요청시 '거부'해서 재요청일 때

}

else

{

// false : 퍼미션 요청이 처음일 경우.

// 퍼미션의 동의 여부를 다이얼로그를 띄워 요청한다. 이 때 '동의', '거부'의 결과값이 onRequestPermissionsResult 으로 콜백된다.

ActivityCompat.

requestPermissions

(

this,
new

String[]{Manifest.permission.

WRITE_EXTERNAL_STORAGE,

Manifest.permission.

READ_EXTERNAL_STORAGE

}

,
PERMISSIONS_REQUEST_RESULT

)

;

}
}

else

{

// false : 퍼미션 동의가 필요하지 않은 권한일 때.

}
}

else

{

// version 6 이하일 때에는 별도의 작업이 필요없다.

}

return true;

}


@Override
public void onRequestPermissionsResult

(

int

requestCode

,

String permissions[]

, int

[] grantResults) {

if

(

PERMISSIONS_REQUEST_RESULT

== requestCode) {

if

(grantResults.

length

>

0

&& grantResults[

0

] == PackageManager.

PERMISSION_GRANTED

) {

// 퍼미션에 동의 했을 때 콜백. 다음 작업을 진행한다.

}

else

{

// 퍼미션을 거부 하였을 때 콜백. 퍼미션이 거부 되어 해당 작업을 진행 할 수 없다.

}

return;

}

}
}

 

 

 

아래 퍼미션들은 안드로이드 6.0(마시멜로우)부터 권한 동의를 받아야 사용할 수 있는 권한들입니다.

(출처: https://developer.android.com/guide/topics/permissions/requesting.html)

 

Table 1. Dangerous permissions and permission groups.

Permission Group Permissions
CALENDAR
CAMERA
CONTACTS
LOCATION
MICROPHONE
PHONE
SENSORS
SMS
STORAGE
 

 

 

[안드로이드] Android 6.0 Marshmallow (마시멜로우)에서 권한 처리작업