Manifest 선언과 런타임 요청은 다른 단계입니다
카메라처럼 민감한 기능은 빌드된 Android App Manifest에 권한이 있어야 하고, 앱을 실행한 뒤 사용자에게도 요청해야 합니다. 커스텀 Manifest를 쓴다면 최종 APK에 선언이 합쳐졌는지 확인합니다.
Unity는 WebCamTexture처럼 사용하는 API를 보고 일부 권한을 Manifest에 자동으로 추가하거나 요청할 수 있습니다. 그래서 소스 Manifest만 보지 말고 실제 빌드에 들어간 Manifest와 실행 코드를 같이 봐야 합니다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.CAMERA" />
</manifest>대화상자가 안 뜬다고 요청 코드부터 반복하지 않습니다
먼저 Permission.HasUserAuthorizedPermission으로 이미 허용된 상태인지 확인합니다. 허용되지 않았다면 사용자가 카메라 기능을 누른 순간 요청합니다. Android는 런타임 권한을 API 23부터 사용하지만, Unity 6.5가 지원하는 Android 기준선은 Android 8.0, API 26입니다.
#if UNITY_ANDROID && !UNITY_EDITOR
using UnityEngine;
using UnityEngine.Android;
public sealed class CameraPermissionGate : MonoBehaviour
{
private PermissionCallbacks callbacks;
public void RequestCamera()
{
if (Permission.HasUserAuthorizedPermission(Permission.Camera))
{
Debug.Log("Camera permission is already granted.");
return;
}
if (Permission.ShouldShowRequestPermissionRationale(Permission.Camera))
Debug.Log("Explain why the camera is needed before requesting again.");
callbacks = new PermissionCallbacks();
callbacks.PermissionGranted += permission =>
Debug.Log($"Granted: {permission}");
callbacks.PermissionDenied += permission =>
Debug.Log($"Denied: {permission}");
Permission.RequestUserPermission(Permission.Camera, callbacks);
}
}
#endif거부 뒤에는 설명과 대체 동선을 둡니다
사용자가 거부한 뒤 같은 요청을 연속으로 보내면 Android 버전과 기기 상태에 따라 대화상자가 다시 나오지 않을 수 있습니다. ShouldShowRequestPermissionRationale이 true면 기능에 왜 권한이 필요한지 먼저 설명합니다. 반복 거부로 더 이상 요청창을 띄울 수 없는 상태라면 기능을 끄고 앱 설정에서 권한을 바꾸는 방법을 안내합니다.
확인은 네 가지면 충분합니다. 처음 설치한 상태에서 허용, 처음 설치한 상태에서 거부, 거부 후 재요청, 이미 허용한 상태에서 재실행입니다. 문제가 특정 기기에서만 생기면 Android 버전과 제조사도 함께 기록합니다.
공식 문서 대조
검증일
Unity 6.5 공식 문서와 Android 권한 API를 기준으로 Manifest 선언, 실행 중 요청, 기존 허용 상태, 거부 뒤 설명 흐름을 대조했습니다. 제조사와 Android 버전에 따라 대화상자 모양과 반복 거부 동작은 달라질 수 있습니다.