[Android] 권한 거는 방법
롤리팝까지는
Android Menifest.xml에 <uses-permission 을 쓰는 방식으로 권한을 준다.
마시멜로우 이후는
Android Menifest.xml에 <uses-permission 도 써주고
실시간 권한 허가작업 도 필요
작업수행 -> 권한 허가 여부 -> 거부 이력 여부 확인
=======================================================
public class MainActivity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/**
* 현재 사용자의 OS버전이 마시멜로우 인지 체크한다.
*/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
/**
* 사용자 단말기의 권한 중 전화걸기 권한이 허용되어 있는지 체크한다.
*/
int permissionResult = checkSelfPermission(Manifest.permission.CALL_PHONE);
// call_phong의 권한이 없을 떄
if (permissionResult == PackageManager.PERMISSION_DENIED) {
// Package는 Android Application의 ID이다.
/**
* 사용자가 CALL_PHONE 권한을 한번이라도 거부한 적이 있는지 조사한다.
* 거부한 이력이 한번이라도 있다면, true를 리턴한다.
* 거부한 이력이 없다면 false를 리턴한다.
*/
if (shouldShowRequestPermissionRationale(Manifest.permission.CALL_PHONE)) {
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
dialog.setTitle("권한이 필요합니다.")
.setMessage("이 기능을 사용하기 위해서는 단말기의 \"전화걸기\"권한이 필요합니다. 계속하시겠습니까?")
.setPositiveButton("네", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 위 리스너랑 다른 범위여서 마쉬멜로우인지 또 체크해주어야 한다.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, 1000);
}
}
})
.setNegativeButton("아니요", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "기능을 취소했습니다.", Toast.LENGTH_SHORT).show();
}
})
.create()
.show();
}
// 최초로 권한을 요청 할 때
else {
// CALL_PHONE 권한을 안드로이드 OS에 요청합니다.
requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, 1000);
}
}
// call_phonne의 권한이 있을 떄
else {
}
}
// 사용자의 버전이 마시멜로우 이하일때
else {
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:010-1111-2222"));
startActivity(intent);
}
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
// 사용자 요청, 요청한 권한들, 응답들
if (requestCode == 1000) {
// 요청한 권한을 사용자가 허용했다면
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:010-1111-2222"));
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
startActivity(intent);
}
}
else {
Toast.makeText(MainActivity.this, "권한요청을 거부했습니다.", Toast.LENGTH_SHORT).show();
}
}
}
}
처음 전화걸기 화면입니다.
전화걸기를 진행할 경우 권한을 받을지 물어봅니다.
거부할 경우 토스트가 뜨는 화면입니다.
다시 전화걸기를 실행시킬 경우 부연설명 창이 먼저 뜹니다.
'Back-end > Android' 카테고리의 다른 글
[Android] LinearLayout (0) | 2016.06.13 |
---|---|
[Android] 버전낮추기 / 마쉬멜로우에서 롤리팝 (3) | 2016.06.13 |
[Android] 선택지 만들기 / select box (0) | 2016.06.10 |
[Android] 겹쳐서 안보일때 / layout_below (0) | 2016.06.10 |
[Android] 이메일 형식 체크 (0) | 2016.06.09 |