안드로이드 API 23 이전에는 앱 설치 시 매니페스트 파일에 등록된 권한이 한 번에 부여되었다. 그런데 API 23 버전부터는 권한이 일반권한과 위험권한으로 분류되고 일반 권한은 앱 설치시에 부여되고 위험 권한은 앱이 처음 실행될 시점에 사용자로부터 부여받도록 되어있다.
위험 권한에는 다음과 같은 것들이 있다.
위험권한을 부여받기 위해서는 매니페스트 파일에 다음 코드를 등록해야 한다.
<uses-permission android:name="android.permission.RECEIVE_SMS" />
이제 자바 소스코드로 위험권한을 부여받기 위한 처리부분을 작성해보자.
package io.swnomad.samplereceiver;
import android.Manifest;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//RECEIVE_SMS 권한 있는지 체크
int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS);
if(permissionCheck==PackageManager.PERMISSION_GRANTED){//권한 있으면 토스트 메시지 띄우기
Toast.makeText(this, "SMS 수신 권한 있음", Toast.LENGTH_LONG).show();
}else{//권한 없으면 권한 요청 대화상자 띄우기
Toast.makeText(this, "SMS 수신 권한 없음", Toast.LENGTH_LONG).show();
if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECEIVE_SMS)){
Toast.makeText(this, "SMS 권한 설명 필요함", Toast.LENGTH_LONG).show();
}else{
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECEIVE_SMS}, 1);
}
}
}
// 권한요청에 대한 사용자의 허용 여부 결과를 받아 처리하는 메소드
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch(requestCode){
case 1:{
if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "권한 승인됨", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(this, "권한 거부됨", Toast.LENGTH_LONG).show();
}
}
}
}
}
이 메소드는 권한을 부여받을 때마다 수정해서 재사용할 수 있다.
앱을 실행하면 다음과 같은 화면이 뜬다.
사용자가 허용하거나 거부하면 onRequestPermissionsResult() 메소드에서 결과를 받아서 처리하고 토스트 메시지를 띄운다.
위험 권한은 한 번 허용하면 앱에 부여된 권한 정보를 안드로이드 시스템이 기억하므로 대화상자가 다시 뜨는일은 없다.
'안드로이드' 카테고리의 다른 글
(안드로이드) 23 - 토스트(Toast) 메시지 (0) | 2020.05.18 |
---|---|
(안드로이드) 22 - 이벤트(Event) 처리 (0) | 2020.05.18 |
(안드로이드) 20 - 브로드캐스트 수신자(Broadcast Receiver) (0) | 2020.05.18 |
(안드로이드) 19 - 서비스(Service) (0) | 2020.05.18 |
(안드로이드) 18 - 액티비티의 수명주기(LifeCycle) (0) | 2020.05.18 |