본문 바로가기
My Image
프로그래밍/Android

[Android] android 마시멜로우 이상 버전 권한체크

by Lim-Ky 2017. 7. 24.
반응형

이번시간은 안드로이드 마시멜로우 이상버전에서 안드로이드 시스템권한 요청 및 체크하는 방법을 알아보도록 하겠다.


실제 실무에 썼던 코드 초창기 버전인데 손봐야할 것이 많다;;


android marshmallow에 대한 이미지 검색결과

안드로이드 - Marshmallow 



안드로이드 버전은 매번 새롭게 출시되는데 마시멜로우 버전부터 사용자에게 앱이 이러저러한 권한을 사용하려한다고 알려줘야하고

그 권한을 사용자가 허락해야지만 정상적으로 앱이 안드로이드 시스템쪽 파일쓰기/읽기/위치정보 등과 기능을 수행할 수 있는 권한을 행사할 수있다.


따라서 반드시 왠만한 앱들이라면 권한을 허락받아야 하는 기능이 있기때문에 

마시멜로우 이상버전에 안드로이드 폰에서 앱을 설치하면 반드시 처음 권한을 허락하겠냐고 물어보는 팝업창이 뜬다.


나는 최초 구동되는 Activtiy에 아래와 같은 코드를 심어 원하는 권한을 허락받도록 했다.

Activity의 생명주기를 보면 반드시 onResume이 실행되기 때문에 onResume에서 checkPermissionF()메서드를 호출하였고

checkPermissionF()메서드안에서 현재 폰의 버전을 체크한 후 마시멜로우 이상인 경우에만 권한을 물어보도록 분기처리했다.


이 코드에 특징이라하면, 여러 권한을 각각 요청하는 점이다.

따라서 내가 필요한 권한을 배열을 이용해 리스트업하고 체크할 수 있다.




@Override
public void onResume(){

checkPermissionF();
super.onResume();
}



private void checkPermissionF() {

if (android.os.Build.VERSION.SDK_INT >= M) {
// only for LOLLIPOP and newer versions
System.out.println("Hello Marshmallow (마시멜로우)");
int permissionResult = getApplicationContext().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);

if (permissionResult == PackageManager.PERMISSION_DENIED) {
//요청한 권한( WRITE_EXTERNAL_STORAGE )이 없을 때..거부일때...
/* 사용자가 WRITE_EXTERNAL_STORAGE 권한을 한번이라도 거부한 적이 있는 지 조사한다.
* 거부한 이력이 한번이라도 있다면, true를 리턴한다.
*/
if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {


AlertDialog.Builder dialog = new AlertDialog.Builder(getApplicationContext());
dialog.setTitle("권한이 필요합니다.")
.setMessage("단말기의 파일쓰기 권한이 필요합니다.\\n계속하시겠습니까?")
.setPositiveButton("확인", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

if (Build.VERSION.SDK_INT >= M) {

System.out.println("감사합니다. 권한을 허락했네요 (마시멜로우)");
/* requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.READ_PHONE_STATE,Manifest.permission.READ_EXTERNAL_STORAGE}, 1);*/
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}

}
})
.setNegativeButton("취소", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(),"권한 요청 취소", Toast.LENGTH_SHORT).show();
}
})
.create()
.show();

//최초로 권한을 요청할 때.
} else {
System.out.println("최초로 권한을 요청할 때. (마시멜로우)");
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
// getThumbInfo();
}
}else{
//권한이 있을 때.
// getThumbInfo();
}

} else {
System.out.println("(마시멜로우 이하 버전입니다.)");
// getThumbInfo();
}

}
/**
* 사용자가 권한을 허용했는지 거부했는지 체크
* @param requestCode 1번
* @param permissions 개발자가 요청한 권한들
* @param grantResults 권한에 대한 응답들
* permissions와 grantResults는 인덱스 별로 매칭된다.
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

if (requestCode == 1) {
/* 요청한 권한을 사용자가 "허용"했다면 인텐트를 띄워라
내가 요청한 게 하나밖에 없기 때문에. 원래 같으면 for문을 돈다.*/
/* requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.READ_PHONE_STATE,Manifest.permission.READ_EXTERNAL_STORAGE}, 1);*/

for(int i = 0 ; i < permissions.length ; i++) {
if (grantResults.length > 0 && grantResults[i] == PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
System.out.println("onRequestPermissionsResult WRITE_EXTERNAL_STORAGE ( 권한 성공 ) ");
}
if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
System.out.println("onRequestPermissionsResult ACCESS_FINE_LOCATION ( 권한 성공 ) ");
}
if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
System.out.println("onRequestPermissionsResult ACCESS_COARSE_LOCATION ( 권한 성공 ) ");
}
/* if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
System.out.println("onRequestPermissionsResult READ_PHONE_STATE ( 권한 성공 ) ");
}*/
if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
System.out.println("onRequestPermissionsResult READ_EXTERNAL_STORAGE ( 권한 성공 ) ");
}
}


}

} else {
System.out.println("onRequestPermissionsResult ( 권한 거부) ");
Toast.makeText(getApplicationContext(), "요청 권한 거부", Toast.LENGTH_SHORT).show();
}

}







반응형

댓글