안드로이드 앱은 핸드폰의 제한된 공간에서 작동 되는데 앱 외부에 있는 리소스(카메라, SMS, 저장공간 등)에 접속 하기 위해서는 핸드폰 소유자의 접근 허가 권한을 받아야 이용이 가능 합니다물론 Android 5.1(API 수준 22) 이하에서 실행하는 기기에 설치된 앱 이라면 권한이 설정 만으로도 자동으로 부여되므로 허가 요청은 필요하지 않습니다.

권한을 요청하는 순서대로 설명을 하면

 

1. 권한 설정

 

앱에서 필요한 권한을 AndroidManifest.xml 파일에 등록을 해야 합니다문법은

<uses-permission android:name="string" android:maxSdkVersion="integer" />

과 같이 작성 합니다.

Parameters

android:name

요청하려는 권한의 이름.

android:maxSdkVersion

권한이 필요한 최고 레벨 값. (“21” 이라면 API 레벨 21까지만 필요하고 22 이상은 필요 없다는 의미)

 

실제 사용 예를 들면 아래처럼 입력하면 됩니다.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />


권한의 종류는 안드로이드 사이트에 리스트 되어 있으며 양이 많아 링크만 연결해 드립니다.

https://developer.android.com/reference/android/Manifest.permission

 

 

2. 앱에 이미 권한이 부여되었는지 확인


사용하려는 권한을 이미 부여 받았다면 권한 요청을 다시 하지는 않습니다.

ContextCompat.checkSelfPermission() 메서드를 사용하여 앱에 이미 권한을 부여 받았는지 확인을 할 수 있습니다호출 결과로는 PERMISSION_GRANTED 또는 PERMISSION_DENIED를 반환 받게 됩니다.


public static int checkSelfPermission (Context context, String permission)


Parameters

context

Context

permission

String : 필요한 권한 명칭

 

Returns

int

PackageManager.PERMISSION_GRANTED - 이미 권한이 있는 경우

PackageManager.PERMISSION_DENIED – 권한이 없는 경우

 

실제 사용 예는 아래와 같습니다.

ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION);

 

 

3. 앱에 권한이 필요한 이유 설명

 

앱에 필요한 권한을 요청 하려는 경우 사용자가 처음 권한을 요청 받은건지 기존에 요청을 받았는데 거부를 한 것인지에 따라 요청 방식을 달리 해야 하고 요청 화면도 달라지게 됩니다.


shouldShowRequestPermissionRationale() 메서드는 사용자가 이전에 권한 요청을 거부한 경우 true 값을 넘겨주게 되어 있습니다그 결과를 이용하여 앱을 사용하려면 권한이 필요함을 사용자에게 알려 주는 안내를 추가 해야 합니다.


public static boolean shouldShowRequestPermissionRationale (Activity activity, String permission)

 

Parameters

activity

Activity: The target activity.

permission

String : 필요한 권한 명칭

 

Returns

boolean

Whether you should show permission rationale UI.

 

if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {

  // 이전에 거부한 경우 권한 필요성 설명 및 권한 요청

} else {

  // 처음 요청하는 경우 그냥 권한 요청

}

 

 

 

4. 권한요청

 

권한 요청은 메소드를 호출 하면서 필요한 권한을 적어주면 됩니다요청 하려는 권한이 한개 이상이면 String 배열에 죽 기입해 주면 되고 너무 많으면 배열을 별도로 작성해서 추가해도 됩니다.


static void requestPermissions(Activity activity, String[] permissions, int requestCode)

 

Parameters

Activity

Activity

permissions

String[p] : 필요한 권한 명칭들

requestCode

실행 후 전달 받을 코드

 

requestCode는 개발자가 임의로 만들어 놓은 코드를 말하고 메소드가 void를 리턴하는데 전달받으려는 값을 설정 한다는 건 메소드 실행 후 onRequestPermissionsResult() 메소드를 이용하여 결과 값을 넘겨 주게 됩니다.

 

- 요청 권한이 한개인 경우


static final int PERMISSIONS_REQUEST_READ_LOCATION = 0x00000001;

 

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},

                        PERMISSIONS_REQUEST_READ_LOCATION);

 

- 요청 권한이 2개 이상인 경우


static final int PERMISSIONS_REQUEST_READ_LOCATION = 0x00000001;

private String[] PERMISSIONS = {

    Manifest.permission.ACCESS_COARSE_LOCATION,

    Manifest.permission.ACCESS_FINE_LOCATION

};

ActivityCompat.requestPermissions(this,PERMISSIONS,PERMISSIONS_REQUEST_READ_LOCATION);

 

 

 

5. 권한요청 응답처리

 

사용자가 권한 요청 대화상자에 응답하면 시스템은 앱의 onRequestPermissionsResult() 메소드를 호출 하게 되고 이곳에서 결과에 대한 다음 작업을 진행하게 됩니다.

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    switch(requestCode) {

        case returnCode:

            if (grantResults.length > 0

                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                 // 권한 허가된 경우 처리

             } else {

                // 권한 거절된 경우 처리

            }

            break;

}

}

 

 

6. 테스트 프로젝트

 

간단한 권한 요청만 진행하는 프로젝트를 하나 생성해 봅니다.


android permission




android permission



 

프로젝트를 생성하고 소스를 입력 합니다.

실제 사용되는 파일은 2개이고 전체 소스 입니다.

 

- AndroidManifest.xml

 

<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
   
package="copycoding.tistory.permissiontest">

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

    <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/AppTheme">
        <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>

 

- MainActivity.java

 

package copycoding.tistory.permissiontest;

import
androidx.annotation.NonNull;
import
androidx.appcompat.app.AppCompatActivity;
import
androidx.core.app.ActivityCompat;
import
android.Manifest;
import
android.content.pm.PackageManager;
import
android.os.Bundle;
import
android.widget.Toast;

public class
MainActivity extends AppCompatActivity {

   
int nCurrentPermission = 0;
    static final int
PERMISSIONS_REQUEST = 0x0000001;

   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
       
setContentView(R.layout.activity_main);
       
OnCheckPermission();
   
}
   
public void OnCheckPermission() {
       
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
               
|| ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
           
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
                Toast.makeText(
this, "앱 실행을 위해서는 권한을 설정해야 합니다", Toast.LENGTH_LONG).show();
               
ActivityCompat.requestPermissions(this,
                        new
String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},
                       
PERMISSIONS_REQUEST);
           
} else {
                ActivityCompat.requestPermissions(
this,
                        new
String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},
                       
PERMISSIONS_REQUEST);
          
}
        }
    }

   
@Override
   
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
       
switch (requestCode) {
           
case PERMISSIONS_REQUEST :
               
if (grantResults.length > 0
                       
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(
this, "앱 실행을 위한 권한이 설정 되었습니다", Toast.LENGTH_LONG).show();
               
} else {
                    Toast.makeText(
this, "앱 실행을 위한 권한이 취소 되었습니다", Toast.LENGTH_LONG).show();
               
}
               
break;
       
}
    }
}

 

 

7. 결과 화면

 

- 처음 권한 요청


android permission



처음 권한을 요청하면 위 그림과 같이 [거부][허용] 버튼이 나타 납니다.

여기에서 거부를 클릭 했습니다.

 

- 거부 후 다시 실행시


android permission


이번에는 [다시묻지않음]이 추가된 요청 화면이 나타 납니다.


- copy coding -



+ Recent posts