[Android / Java] 권한 설정
* 목표 : 권한을 요청하고 관리해보자
안드로이드의 카메라 기능, 외부 저장소 읽고 쓰는 기능, 주소록, 인터넷 등 앱에서 필요한 기능을 구현하기 위해서는 권한을 갖고 있어야 한다.
요새 개인정보로 민감한 시기에 최소한 권한을 요청하고 뺏는 방법은 알고 있도록 하자!
먼저 manifest 파일에 권한을 요청한다.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.ming_gu">
<!--Permission-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Ming_gu">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Camera 기능 및 내/외부 저장소에 저장할 수 있도록 permission을 설정해준다.
앱의 권한 문제는 굉장히 깐깐하고 예민하게 작업해야 하는 부분이다. 이와 관련해 TedPermission 같은 라이브러리를 사용하면 편하지만 지금은 매뉴얼로 쓱싹 하는 과정을 보여주겠다.
앱 실행 시 권한을 확인하고, 권한이 없으면 권한을 요청하고, 요청이 거부되면 앱을 종료하는 프로세스로 작업을 진행한다.
//권한 확인
public void checkPermission() {
int permissionCamera = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
int permissionRead = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);
int permissionWrite = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
//권한이 없으면 권한 요청
if (permissionCamera != PackageManager.PERMISSION_GRANTED
|| permissionRead != PackageManager.PERMISSION_GRANTED
|| permissionWrite != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
Toast.makeText(this, "이 앱을 실행하기 위해 권한이 필요합니다.", Toast.LENGTH_SHORT).show();
}
ActivityCompat.requestPermissions(this, new String[]{
Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION);
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_PERMISSION: {
// 권한이 취소되면 result 배열은 비어있다.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "권한 확인", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "권한 없음", Toast.LENGTH_LONG).show();
finish(); //권한이 없으면 앱 종료
}
}
}
}
앱을 실행할 때는 권한을 줘놓고 애플리케이션 관리자에서 권한을 뺏어가는 변태들이 있을 수 있으니 onResume시에 권한을 다시 한번 체크하도록 하자.
@Override
public void onResume() {
super.onResume();
checkPermission(); //권한체크
}
MainActivity.java
package com.example.ming_gu;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
public static final int REQUEST_PERMISSION = 11;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkPermission(); //권한체크
}
//권한 확인
public void checkPermission() {
int permissionCamera = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
int permissionRead = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);
int permissionWrite = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
//권한이 없으면 권한 요청
if (permissionCamera != PackageManager.PERMISSION_GRANTED
|| permissionRead != PackageManager.PERMISSION_GRANTED
|| permissionWrite != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
Toast.makeText(this, "이 앱을 실행하기 위해 권한이 필요합니다.", Toast.LENGTH_SHORT).show();
}
ActivityCompat.requestPermissions(this, new String[]{
Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_PERMISSION: {
// 권한이 취소되면 result 배열은 비어있다.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "권한 확인", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "권한 없음", Toast.LENGTH_LONG).show();
finish(); //권한이 없으면 앱 종료
}
}
}
}
@Override
public void onResume() {
super.onResume();
checkPermission(); //권한체크
}
}
<참고자료>
'Andorid' 카테고리의 다른 글
[Android] Activity와 Fragment (2) | 2020.12.09 |
---|---|
[Android / Java] Camera 촬영 및 내부/외부 저장소에 저장 (8) | 2020.12.06 |
[Android] Layout / View Group의 종류 1. Linear Layout (1) | 2020.12.02 |
[Android / Java] ViewHolder를 이용한 Custom Adapter 만들기 (2) | 2020.11.27 |
[Android / Java] Programmatic하게 레이아웃을 만들기 (3) | 2020.11.24 |