안드로이드가 최적화 단계를 거치며 업데이트 하면서 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)
Permission Group | Permissions |
---|---|
CALENDAR |
|
CAMERA |
|
CONTACTS |
|
LOCATION |
|
MICROPHONE |
|
PHONE |
|
SENSORS |
|
SMS |
|
STORAGE |
'프로그래밍 > 안드로이드' 카테고리의 다른 글
[안드로이드] 상태바, 타이틀바 숨기기(제거), 전체화면 - StatusBar,TitleBar , Full Screen (0) | 2017.08.18 |
---|---|
[안드로이드] Intent (인텐트) 에 대해 알아보자 (0) | 2017.08.17 |
[안드로이드] 뒤로 버튼 두번 눌러 종료하기 (0) | 2017.08.15 |
[안드로이드] 키보드 보이기(올리기) / 숨기기(내리기) - android keyboard show/hide (0) | 2017.08.14 |
[안드로이드] 쉐어드 프리퍼런스 저장/불러오기 (Shared Preference) (2) | 2017.08.13 |
댓글