티스토리 뷰
SDK 23부터는 실행중 사용자에게 권한허용을 받아야합니다.
물론 모든 권한을 사용중 사용자에게 허용받아야 하는것은 아닙니다.
위험권한의 경우에만 사용중 권한이 필요합니다.
위험권한에 해당하는 권한은 아래의 표를 참조해주세요.
https://developer.android.com/guide/topics/security/permissions
1. 권한을 요청할것이 1개인 경우
- 필요한 권한을 AndroidManifest.xml에 추가
- 권한 확인 및 권한 요청
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.marshmello.example">
<uses-permission android:name="android.permission.CAMERA" />
...생략
- 권한 요청에 대한 결과 처리
//권한 요청에 대한 결과 처리
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case SINGLE_PERMISSION:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
/*권한이 있는경우 실행할 코드....*/
} else {
// 하나라도 거부한다면.
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.setTitle("앱 권한");
alertDialog.setMessage("해당 앱의 원할한 기능을 이용하시려면 애플리케이션 정보>권한> 에서 모든 권한을 허용해 주십시오");
// 권한설정 클릭시 이벤트 발생
alertDialog.setPositiveButton("권한설정",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).setData(Uri.parse("package:" + getApplicationContext().getPackageName()));
startActivity(intent);
dialog.cancel();
}
});
//취소
alertDialog.setNegativeButton("취소",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
alertDialog.show();
}
return;
}
}
- 전체코드 (single.txt)
package com.marshmello.example;
import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
public class PermissionActivity extends AppCompatActivity {
private static final int SINGLE_PERMISSION = 1004; //권한 변수
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//권한이 있는지 확인
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {//권한없음
//권한 요청 코드
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA}, SINGLE_PERMISSION);
} else {//권한있음
/*..권한이 있는경우 실행할 코드....*/
}
}
//권한 요청에 대한 결과 처리
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case SINGLE_PERMISSION:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
/*권한이 있는경우 실행할 코드....*/
} else {
// 하나라도 거부한다면.
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.setTitle("앱 권한");
alertDialog.setMessage("해당 앱의 원할한 기능을 이용하시려면 애플리케이션 정보>권한> 에서 모든 권한을 허용해 주십시오");
// 권한설정 클릭시 이벤트 발생
alertDialog.setPositiveButton("권한설정",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).setData(Uri.parse("package:" + getApplicationContext().getPackageName()));
startActivity(intent);
dialog.cancel();
}
});
//취소
alertDialog.setNegativeButton("취소",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
alertDialog.show();
}
return;
}
}
}
2. 권한을 요청할것이 여러개인 경우
- 필요한 권한들을 AndroidManifest.xml에 추가
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.marshmello.example">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.location.gps" />
.
....
- 권한 확인 및 권한 요청
private static final int MULTIPLE_PERMISSION = 10235;
//요청할 권한들 배열로 선언
private String[] PERMISSIONS = {
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
android.Manifest.permission.CAMERA
};
//권한이 있는지 확인하는 메소드 작성
public static boolean hasPermissions(Context context, String... permissions) {
if (context != null && permissions != null) {
for (String permission : permissions) {
if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
}
return true;
}
if (!hasPermissions(this, PERMISSIONS)) {//권한이 없는 경우
//권한요청
ActivityCompat.requestPermissions(this, PERMISSIONS, MULTIPLE_PERMISSION);
} else {
/*..권한이 있는경우 실행할 코드....*/
}
- 권한 요청에 대한 결과 처리
//권한 요청에 대한 결과 처리
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MULTIPLE_PERMISSION:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
/*..권한이 있는경우 실행할 코드....*/
} else {
// 하나라도 거부한다면.
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.setTitle("앱 권한");
alertDialog.setMessage("해당 앱의 원할한 기능을 이용하시려면 애플리케이션 정보>권한> 에서 모든 권한을 허용해 주십시오");
// 권한설정 클릭시 이벤트 발생
alertDialog.setPositiveButton("권한설정",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).setData(Uri.parse("package:" + getApplicationContext().getPackageName()));
startActivity(intent);
dialog.cancel();
}
});
//취소
alertDialog.setNegativeButton("취소",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
alertDialog.show();
}
return;
}
}
- 전체코드 (multiple.txt파일 다운로드 후 복붙하면 편해요)
package com.marshmello.example;
import android.Manifest;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
public class PermissionActivity extends AppCompatActivity {
private static final int MULTIPLE_PERMISSION = 10235;
private String[] PERMISSIONS = {
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
android.Manifest.permission.CAMERA
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!hasPermissions(this, PERMISSIONS)) {
ActivityCompat.requestPermissions(this, PERMISSIONS, MULTIPLE_PERMISSION);
} else {
/*..권한이 있는경우 실행할 코드....*/
}
}
public static boolean hasPermissions(Context context, String... permissions) {
if (context != null && permissions != null) {
for (String permission : permissions) {
if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
}
return true;
}
//권한 요청에 대한 결과 처리
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MULTIPLE_PERMISSION:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
/*..권한이 있는경우 실행할 코드....*/
} else {
// 하나라도 거부한다면.
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.setTitle("앱 권한");
alertDialog.setMessage("해당 앱의 원할한 기능을 이용하시려면 애플리케이션 정보>권한> 에서 모든 권한을 허용해 주십시오");
// 권한설정 클릭시 이벤트 발생
alertDialog.setPositiveButton("권한설정",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).setData(Uri.parse("package:" + getApplicationContext().getPackageName()));
startActivity(intent);
dialog.cancel();
}
});
//취소
alertDialog.setNegativeButton("취소",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
alertDialog.show();
}
return;
}
}
}
실행화면
감사합니다!
'Android' 카테고리의 다른 글
[Android] 안드로이드 키해시 간편하게 생성하기 (2) | 2018.06.15 |
---|
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크