본문 바로가기
안드로이드 자바

[JAVA][Android] 권한 설정하기

by teamnova 2021. 5. 1.

이번 포스팅에선 앱을 만들 때 중요한 것 중 하나인 권한을 설정하는 방법을 다루겠습니다.

 

먼저 앱 수준 gradle 파일을 열어 의존성 문구를 하나 추가해줍니다.

implementation 'gun0912.ted:tedpermission:2.2.3'

 

권한 설정을 좀 더 편리하게 할 수 있는 라이브러리를 사용하기 위한 의존성입니다.

그리고 매니페스트에 아래 권한을 추가해줍니다.

<uses-permission android:name="android.permission.CAMERA"/>

 

다음은 xml 코드입니다. 버튼을 누르면 카메라 권한을 요청하는 화면을 띄울 것이기 때문에 화면 구성은 버튼 하나만 있는 매우 간단한 화면입니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="권한 요청"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

다음은 자바 코드입니다. 버튼만 있기 때문에 간단하게 클릭 리스너만 만들겠습니다.

public class MainActivity extends AppCompatActivity
{
    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                
            }
        });
    }

}

 

버튼 클릭 리스너를 만들었으니 이제 카메라 권한을 요청하는 코드만 넣으면 됩니다.

빠르게 만들기 위해 아래의 스틱코드 포스팅에서 코드를 가져와 사용하겠습니다.

stickode.com/detail.html?no=2080

 

스틱코드

 

stickode.com

포스팅을 즐겨찾기하셨다면 아래와 같이 'PERMISSION'이라는 탭이 보입니다.

 

저것을 선택하면 아래와 같이 권한을 요청하는 코드의 기본 틀이 완성됩니다.

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.gun0912.tedpermission.PermissionListener;
import com.gun0912.tedpermission.TedPermission;

import java.util.List;

public class MainActivity extends AppCompatActivity
{
    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                PermissionListener permissionListener = new PermissionListener()
                {
                    @Override
                    public void onPermissionGranted()
                    {
                        Toast.makeText(MainActivity.this, "권한이 허가된 상태입니다", Toast.LENGTH_SHORT).show();
                        Log.e("권한", "권한 허가 상태");
                    }

                    @Override
                    public void onPermissionDenied(List<String> deniedPermissions)
                    {
                        Toast.makeText(MainActivity.this, "권한이 거부된 상태입니다", Toast.LENGTH_SHORT).show();
                        Log.e("권한", "권한 거부 상태");
                    }
                };

                TedPermission.with(MainActivity.this)
                        .setPermissionListener(permissionListener)
                        .setRationaleMessage("카메라 권한이 필요합니다!")
                        .setDeniedMessage("지금 거부하시더라도 '설정 > 권한'에서 다시 권한을 허용하실 수 있습니다")
                        .setPermissions()
                        .check();
            }
        });
    }

}

 

이제 마지막으로 setPermissions() 안에 어떤 권한을 요청할 것인지를 적어주면 됩니다.

이 부분에 넣을 권한은 다양한 방식으로 넣을 수 있는데, 이 포스팅에선 카메라 권한만을 필요로 하기 때문에 아래와 같이 적겠습니다.

.setPermissions(Manifest.permission.CAMERA)

 

완성된 형태는 아래와 같습니다.

import android.Manifest;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.gun0912.tedpermission.PermissionListener;
import com.gun0912.tedpermission.TedPermission;

import java.util.List;

public class MainActivity extends AppCompatActivity
{
    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                PermissionListener permissionListener = new PermissionListener()
                {
                    @Override
                    public void onPermissionGranted()
                    {
                        Toast.makeText(MainActivity.this, "권한이 허가된 상태입니다", Toast.LENGTH_SHORT).show();
                        Log.e("권한", "권한 허가 상태");
                    }

                    @Override
                    public void onPermissionDenied(List<String> deniedPermissions)
                    {
                        Toast.makeText(MainActivity.this, "권한이 거부된 상태입니다", Toast.LENGTH_SHORT).show();
                        Log.e("권한", "권한 거부 상태");
                    }
                };

                TedPermission.with(MainActivity.this)
                        .setPermissionListener(permissionListener)
                        .setRationaleMessage("카메라 권한이 필요합니다!")
                        .setDeniedMessage("지금 거부하시더라도 '설정 > 권한'에서 다시 권한을 허용하실 수 있습니다")
                        .setPermissions(Manifest.permission.CAMERA)
                        .check();
            }
        });
    }

}

 

앱을 실행시켜서 어떻게 동작하는지 확인해 보겠습니다.

 

정상적으로 카메라 권한을 얻었습니다. 만약 사용자가 거부할 경우 아래와 같이 설정 화면으로 이동해서 허용하도록 유도할 수 있습니다.