개요
어떤 권한들을 체크해야 할까?
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />AndroidMenifest.xml에 선언한 모든 시스템 권한을 체크하고 허가를 받아야 하는것은 아닙니다.
구글에서는 정상 권한과 위험 권한을 구별하고 있습니다.
저희는 위험 권한에 대해서만 체크하고 허가를 요청하면 되는거죠.
그럼 권한의 종류는 어떻게 될까요?
아래 링크(안드로이드 레퍼런스)를 통해 권한을 확인 할 수 있습니다.
https://developer.android.com/guide/topics/security/permissions?hl=ko#normal-dangerous
위 레퍼런스에서 확인한 바와 같이 개인정보를 침해하는 권한들이 위험 권한으로 구별되었네요.
예를 들면 주소록, 단말기 정보 등이 될 수 있겠네요.
권한을 체크하기 위한 라이브러리 및 메서드
1. 라이브러리
import com.android.support.v4.*;
권한을 체크하기 위해서 ActivityCompat, CotextCompat 등의 클래스들을 이용해야하는데 이 클래스들은 안드로이드 서포트 라이브러리에 포함되어 있습니다.
2. 권한 허가 상태 체크
ContextCompat.checkSelfPermission(Context, String)
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACT) != PackageManager.PERMISSION_GRANTED) {
// 주소록 권한 사용이 허가되지 않음
} else {
// 주소록 권한 사용이 허가됨
}
3. 권한 사용 목적 설명이 필요한지 체크
ActivityCompat.shouldShowRequestPermissionRationale(Context, String)
예제) 주소록 접근 권한 체크
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACT)) {
// 이 곳에 사용 목적 설명 UI(다이얼로그) 출력
} else {
// 설명이 필요 없음
}
4. 권한 요청 및 결과
ActivityCompat.requestPermission (Context, String[], int)
ActivityCompat.requestPermission(this. new String[1] { Manifest.permission.READ_CONTACT }, 0);onRequestPermissionsResult (int, @NonNull String[], @NonNull int[])
권한 요청을 하였다면, 그 결과를 반환 받아야 해당 권한을 이용하여 게임이 구동되겠죠?
이 때 onRequestPermissionsResult (int, @NonNull String[], @NonNull int[]) 라는 오버라이드 메서드로 반환받게 됩니다.
예제) 처리 결과
void onRequestPermissionsResult (int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
/* 이 곳에서 결과값을 처리합니다.
* requestCode : 권한 허가를 요청시 구분용으로 입력한 int 인자
* permissions : 권한 허가를 요청했던 권한 종류들
* grantResults : 요청했던 권한들의 결과 값들 (허가 - [0] or 거부 - [-1])
* permissions와 grantResults의 배열 크기가 동일하고, 같은 인덱스를 사용
*/
}
Unity용 플러그인(Plug-in)
Last Update : 2018. 11. 08.
Version 1.0.0
permissions-1.0.0.unitypackage
(안드로이드 라이브러리를 요구하기 때문에 구글에서 제공하는 PlayServiceResolver를 사용 및 포함하고 있습니다.)
적용 방법
권한 체크 기능을 작성할 스크립트 상단에 플러그인 클래스를 참조할 수 있도록 선언합니다.
using Dasony.Libs.Android;
이렇게 선언 후에 아래 설명을 보시고 필요한 기능을 구현하시면 됩니다.
1. 플러그인 초기화
public class Test : MonoBehaviour {
Permissions checker;
void Start () {
checker = Permissions.Instance;
}
}
2. 권한 허가 상태 체크
Permissions.CheckPermission (string permission, Action<string, bool> resultCallback)
예제) 주소록 읽기 권한 체크
public void CheckPermission () {
checker.CheckPermission (Permissions.READ_CONTACTS, (permission, granted) => {
if(!granted) {
// 이곳에 Rationale 이나 Request 구현
} else {
// 권한이 허가된 상태이므로 권한을 이용한 기능 구현 혹은 메서드 호출
}
});
}
3. 권한 사용 목적 설명 필요 체크
Permissions.CheckRationale (string permission, Action<string, bool> resultCallback)
예제) 주소록 읽기 권한 설명 체크
public void CheckPermissionRationale () {
checker.CheckRationale (Permissions.READ_CONTACTS, (permission, isExplain) => {
if(!isExplain) {
// 이곳에 설명할 UI 출력
} else {
// 설명이 필요 없으므로 권한 요청 구현
}
});
}
4. 권한 허가 요청
Permissions.RequestPermissions (string[] permissions, int requestCode, Action<PermissionData[] datas)
public void RequestPermission () {
checker.RequestPermissions (new string[] { Permissions.READ_CONTACTS }, 0, (permissionDatas) => {
if(permissionDatas != null) {
if(permissionDatas[0].granted) { // 1개의 권한을 요청했기에 인덱스 0번 데이터만 비교
// 권한 허가됨
// 권한을 이용한 기능 구현 혹은 메서드 호출
} else {
// 권한 거부됨
// 권한이 거부되어 해당 권한이 필요한 기능을 사용할 수 없음을 사용자에게 알려주는 UI 출력
}
} else {
// 권한 허가 요청 실패
}
});
}권한 허가 요청은 한번에 다수의 권한을 요청 할 수 있으므로, 사용 목적 UI 출력시 필요한 권한 모두를 한번에 설명하는 방법도 사용되고 있습니다.
예제에는 없지만, 조금만 이해하시면 쉽게 구현하실 수 있습니다.
자동 권한 허가 요청 다이얼로그 스킵
유니티에는 아무런 설정이 없는 상태에서 빌드를 하면 허가를 요청해야하는 권한들을 자동으로 체크하여 게임 시작시 다이얼로그를 출력해주는 기능이 적용되어 있습니다.
이 기능을 해제하려면 AndroidManifest.xml 파일에 아래 내용을 추가하면 됩니다.
<meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />
예제) AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.dasony.study" xmlns:tools="http://schemas.android.com/tools" android:installLocation="preferExternal">
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
<application android:theme="@style/UnityThemeSelector" android:icon="@mipmap/app_icon" android:label="@string/app_name">
<activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
<meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" /> // 권한 허가 요청 스킵
</activity>
</application>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
</manifest>도움이 되셨나요?
잘못된 내용이나 이해가 잘 안되시면 댓글이나 방명록을 남겨주세요.
'Develop > Plug-in' 카테고리의 다른 글
| [NATIVE, ANDROID] Local Notification(로컬 알림) 유니티 플러그인 (8) | 2019.01.05 |
|---|
permissions-1.0.0.unitypackage