안드로이드 런타임 퍼미션 요청.
이것 저것 하느라 기능 하나를 제대로 마무리 하지 못하고 있는데 안드로이드 주소록 가져오기를 하는 도중 인터넷에 찾은 소스는 안드로이드의 퍼미션에 대한 부분은 누락되어진 소스가 많았다.
아이폰의 경우에도 퍼미션이 필요한 기능이 실행될 때 권한을 획득하는 경우가 많이 있는데 책을 찾아보니 안드로이드의 경우에도 보통과 위험 퍼미션으로 나눠져 요청을 하고 결과를 받아 화면 처리가 가능하도록 구현하게 되어 있다.
따라서 주소록 데이터에 접근하기 위해서는 READ_CONTACTS 퍼미션이 필요하며 이 역시 Manifest에 선언을 한 뒤 해당 기능이 실행되는 런타임시에도 역시 권한을 요청해야 한다.
안드로이드 6.0이상 버전에서 위험(dangerous) 퍼미션이 추가가되었다. 보통 퍼미션의 경우 앱 설치 시점에 사용자의 승인을 받고 위험 퍼미션의 경우는 앱이 실행될 때에도 최초 한번 사용자의 승인을 받아야 한다. 이것을 런타임 퍼미션이라고 한다.
Activity가 실행되고 주소록을 가져오기 위해 퍼미션을 받았는지 체크하는 함수와 사용자의 승인 여부를 체크해서 받는 리스너 구현이 필요하게 되었다.
/**
* Show the contacts in the ListView.
*/
private void showContacts() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) !=
PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[] { Manifest.permission
.READ_CONTACTS }, PERMISSIONS_REQUEST_READ_CONTACTS);
txtDescription.setVisibility(View.VISIBLE);
txtDescription.setText("앱의 주소록 액세스 권한이 필요합니다.");
return;
}
}
위의 함수는 checkSelfPermission함수를 통해 주소록 접근 권한을 체크하고 아직 권한이 없는 경우 ActivityCompat의 requestPermissions를 이용해 요청한다.
권한을 묻는 팝업에서 사용자의 승인/거부에 대한 응답을 처리하기 위해서는 onRequestPermissionsResult를 Override해서 처리하면된다.
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission is granted
showContacts();
} else {
Toast.makeText(this, "앱의 주소록 액세스 권한이 필요합니다.", Toast.LENGTH_SHORT).show();
}
}
}
'프로그래밍 > Android' 카테고리의 다른 글
안드로이드 DialogFragment를 이용한 팝업 페이징 구현하기 (0) | 2019.05.14 |
---|---|
FirebaseInstanceId 등록 및 토큰(token) 정보 얻기(FCM이용방법) (0) | 2019.05.07 |
Android 주소록 가져오기 (연락처 및 프로필 사진) (0) | 2018.11.30 |
android EditText 커서 색상, 위치 밑줄 설정에 대한 이야기 (0) | 2018.11.23 |
안드로이드 둥근 모서리 레이아웃 만드는 방법(@drawable) (0) | 2018.11.23 |