프로그래밍/안드로이드

[안드로이드] 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
 

 

 

 

 

 

 

 

 

댓글

💲 추천 글