1. 개요


안드로이드 6.0 이상 버전에서 사용자에 의해 권한을 부여 받아야 사용 가능한 기능 (카메라, 파일 접근 등)을 이용하려면 런타임 퍼미션( runtime permissions)이 필요합니다.


본 포스팅에서는 퍼미션을 체크하고 요청하는 방법에 대해 기술합니다.


핵심 함수는 다음과 같습니다.


퍼미션 체크 ActivityCompat.checkSelfPermission(Context, String)

퍼미션 요청 ActivityCompat.requestPermissions(Activity, String[], int)

퍼미션 요청 콜백함수 ActivityCompat.OnRequestPermissionsResultCallback


콜백함수(OnRequestPermissionsResultCallback) 의 경우 AppCompatActivity 에 오버라이드 (Override) 되어 있는 함수이기 때문에 실제 권한 요청을 수행하는 Activity 에 코드가 포함되지만 그 외 나머지 함수들은 별도의 CustomClass 를 작성하여 호출하도록 구성하였습니다.


2. 소스 코드


1) AndroidManifest.xml


실제 사용하고자 하는 요청 권한을 명기 합니다.


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


2) PermissionUtil.java


퍼미션 체크(checkSelfPermission) 와 퍼미션 요청(requestPermissions) 을 실제로 호출하는 CustomClass 입니다.


해당 부분은 내용이 길어 첨부한 소스코드 파일의 주석으로 대체 합니다.


PermissionUtil.java


3) MainActivity.java


앱 최초 실행 시 권한을 받아 결과에 따라 앱을 실행할지 말지 여부를 결정하기 위해 최초 실행 되는 Activity의 onCreate 에서 호출하도록 합니다.


만약 해당 기능 사용과 별개로 앱을 사용하다가 실제 기능 동작이 필요한 경우에 권한을 요청하려면 (예를 들어 사진 앨범에 접근하기 위해 가져오기 버튼을 클릭하는 순간 권한을 묻기를 원한다면) 해당 기능 동작 중 (OnClickListener 내부)에 호출하도록 합니다.



private PermissionUtil m_PermissionTool;
private String strPermissions[] = {
	Manifest.permission.READ_EXTERNAL_STORAGE
};

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);

	// 권한 검사
	m_PermissionTool = new PermissionUtil(this, strPermissions);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
	super.onRequestPermissionsResult(requestCode, permissions, grantResults);

	switch (requestCode) {
		case PermissionUtil.MY_PERMISSIONS_REQUEST_READ_CONTACTS:
			if (m_PermissionTool.verifyPermission(permissions, grantResults) == false) {
				// 권한 얻기 실패
				m_PermissionTool.showRequestAgainDialog();
			}
			break;
	}
}


3. 참조


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



+ Recent posts