참고 : dev-minsuuuus.tistory.com/38
1. Project 생성하기
Android Studio에서 New Project를 선택하여 프로젝트를 새로 생성하여 준다.
좌측 메뉴에서 Phone and Tablet을 선택하고 Empty Views Activity를 선택하여 준다.
기본적인 Empty Views Activity를 사용하기위해 아래와 같이 값을 입력하여준다.
입력 및 선택이 마무리 되었다면 [ Finish ] 버튼을 클릭하여 프로젝트를 새로 생성하여 준다.
2. Gradle 설정
프로젝트가 생성되면 build.gradle 파일을 오픈하여 viewBinding 설정을 활성화( true ) 시켜 준다.
build.gradle( Module : app )
plugins {
alias(libs.plugins.android.application)
}
android {
namespace "com.example.permission"
compileSdk 34
defaultConfig {
applicationId "com.example.permission"
minSdk 24
targetSdk 34
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
buildFeatures {
viewBinding = true
}
}
dependencies {
implementation libs.appcompat
implementation libs.material
implementation libs.activity
implementation libs.constraintlayout
testImplementation libs.junit
androidTestImplementation libs.ext.junit
androidTestImplementation libs.espresso.core
}
변경을 완료하였다면 [ Sync Now ] 를 클릭하여 Build 하여 준다.
3. Manifest 설정
AndroidManifest.xml 파일에서 uses-permission과 uses-feature는 Android Application이 시스템과 상호작용하고,
특정 하드웨어나 소프트웨어 기능을 활용하기 위해 설정하는 중요한 요소이다.
1) uses-permission
• App이 특정 기능을 사용하기 위해 필요한 권한을 선언한다.
• 예를 들어, 인터넷에 접근하거나 사용자의 위치 정보를 얻기 위해서는 해당 권한을 명시해야 한다.
• 권한이 설정된 경우, 사용자는 앱 설치 시 해당 권한을 허용할지 선택하게 된다.
2) uses-feature
• Application이 필요로 하는 특정 하드웨어 또는 소프트웨어 기능을 선언
• 이 요소는 Application이 특정 기능을 필요로 하는지 또는 그 기능이 필수적인지 여부를 명시할 수 있다.
• 만약 uses-feature에서 요구된 기능이 사용자의 기기에 없다면,
App이 설치되지 않거나 Google Play에서 해당 기기로는 App이 표시되지 않는다.
해당 포스팅에서 사용 허가할 권한은 3가지 이다.
① 카메라
② 전화
③ 위치( GPS )
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- 사용권한 부여 확인 android.permission.* -->
<!-- android:required="false" App이 정상 작동에 필수 유무인지를 설정 -->
<uses-permission android:name="android.permission.CAMERA" android:required="false"/> <!-- 카메라 권한 선언 -->
<uses-permission android:name="android.permission.CALL_PHONE" android:required="false"/> <!-- 전화 권한 선언 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:required="false" tools:ignore="CoarseFineLocation"/> <!-- 위치 권한 선언 -->
<!-- 하드웨어의 존재유무 확인 android.hardware.* -->
<!-- android:required="false" 지원하지 않아도 설치 가능 -->
<uses-feature android:name="android.hardware.camera" android:required="false"/> <!-- 카메라 기능 -->
<uses-feature android:name="android.hardware.location" android:required="false"/> <!-- 위치(GPS) 기능 -->
<uses-feature android:name="android.hardware.telephony" android:required="false"/> <!-- 전화 기능 -->
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AccessAuthorization"
tools:targetApi="31">
<activity
android:name=".activity.MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
4. Activity 파일 생성
App이 실행되면 처음 보여질 MainActivity가 실행되면 onStart( ); 메서드가 실행되어
권한 설정 허용 유무를 사용자에게 묻게 된다.
MainActivity.java
package com.example.permission.activity;
import android.os.Build;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.example.permission.databinding.ActivityMainBinding;
import com.example.permission.utility.PermissionUtility;
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
private PermissionUtility permissionUtility;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 뷰 바인딩 객체 획득
binding = ActivityMainBinding.inflate(getLayoutInflater());
// 액티비티 화면 출력
setContentView(binding.getRoot());
}
@Override
protected void onStart() {
super.onStart();
permissionCheck();
}
// 권한 체크
private void permissionCheck() {
// SDK 23버전 이하 버전에서는 권한이 필요하지 않음
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 클래스 객체 생성
permissionUtility = new PermissionUtility(this, this);
// 권한 체크한 후에 리턴이 false일 경우 권한 요청을 해준다.
if(permissionUtility.checkPermission() == false) {
permissionUtility.requestPermission();
}
}
}
}
5. 권한 관리 Utility 클래스 구현
사용자가 App의 특정 기능을 사용해야 할 때 권한을 요청할 PermissionUitilty.java 클래스를 구현한다.
utility 패키지를 생성하고 PermissionUitilty.java 클래스를 작성하여 준다.
PermissionUtility.java
package com.example.permission.utility;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.util.ArrayList;
import java.util.List;
public class PermissionUtility {
private final Context context;
private final Activity activity;
private List<String> permissionList;
private final int MULTIPLE_PERMISSIONS = 1023;
// Manifest에 권한을 작성 후 요청할 권한을 배열로 저장
private String[] permissions = {
Manifest.permission.CAMERA // 카메라 권한
, Manifest.permission.CALL_PHONE // 전화 권한
, Manifest.permission.ACCESS_FINE_LOCATION // 위치 권한
, Manifest.permission.ACCESS_COARSE_LOCATION // 위치 권한( 단기 위치 )
};
// 생성자
public PermissionUtility(Activity activity, Context context) {
this.activity = activity;
this.context = context;
}
// 허용할 권한 요청이 남았는지 체크
public boolean checkPermission() {
int result;
permissionList = new ArrayList<>();
// 배열로 저장한 권한 중 허용되지 않은 권한이 있는지 체크
for(String permission : permissions) {
result = ContextCompat.checkSelfPermission(context, permission);
if(result != PackageManager.PERMISSION_GRANTED) {
permissionList.add(permission);
}
}
return permissionList.isEmpty();
}
// 권한 허용 요청
public void requestPermission() {
ActivityCompat.requestPermissions(activity, permissionList.toArray(new String[0]), MULTIPLE_PERMISSIONS);
}
// 권한 요청에 대한 결과 처리
public boolean permissionResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if(requestCode == MULTIPLE_PERMISSIONS && grantResults.length > 0) {
for(int num = 0; num < grantResults.length; num++) {
// grantResults == PackageManager.PERMISSION_GRANTED 사용자가 허용한 것
// grantResults == PackageManager.PERMISSION_DENIED 사용자가 거부한 것
if(grantResults[num] == PackageManager.PERMISSION_DENIED) {
return false;
}
}
}
return true;
}
}
'Android > Java Code' 카테고리의 다른 글
[Android] App 실행시 Intro 화면 제작 (0) | 2024.07.29 |
---|---|
[Android] WebView를 이용한 Hybrid App 만들기 (0) | 2024.07.29 |
[Android] Retrofit2를 사용한 API 통신 설정 및 Data 송수신 (0) | 2023.02.07 |
[Android] Keyboard위에 Edit Text 올리기 (0) | 2023.02.06 |
[Android] 출력 위치를 확인하는 Custom Log Message 제작 (0) | 2023.02.02 |