CAMERA와 같은 일부 권한은 앱이 일부 Android 기기만 보유하고 있는 하드웨어에 액세스하도록 허용합니다. 앱에서 이러한 하드웨어 관련 권한 중 하나를 선언하는 경우, 이러한 하드웨어가 없는 기기에서는 여전히 앱을 실행할 수 없는지 고려해야 합니다. 대부분의 경우 하드웨어는 선택사항이므로 AndroidManifest.xml 파일의 다음 코드 스니펫에서와 같이 <uses-feature> 선언에서 android:required를 false로 설정하여 하드웨어를 선택사항으로 선언하는 것이 좋습니다.
하드웨어를 선택사항이라고 선언하면 앱이 해당 하드웨어가 없는 기기에서도 실행될 수 있습니다. 기기에 특정 하드웨어가 있는지 확인하려면 다음 코드 스니펫과 같이 hasSystemFeature() 메서드를 사용하세요. 하드웨어를 사용할 수 없다면 앱에서 해당 기능을 적절하게 사용 중지합니다.
Kotlin
// Check whether your app is running on a device that has a front-facing camera.if(applicationContext.packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT)){// Continue with the part of your app's workflow that requires a// front-facing camera.}else{// Gracefully degrade your app experience.}
자바
// Check whether your app is running on a device that has a front-facing camera.if(getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT)){// Continue with the part of your app's workflow that requires a// front-facing camera.}else{// Gracefully degrade your app experience.}
이러한 요소 중 하나를 사용할 경우 maxSdkVersion 속성을 설정하여, 지정된 값보다 높은 버전의 Android를 실행하는 기기에 특정 권한이 필요하지 않음을 나타낼 수 있습니다. 이렇게 하면 이전 기기와의 호환성을 제공하면서 불필요한 권한을 제거할 수 있습니다.
예를 들어 앱에서는 사용자가 앱을 사용하면서 만든 미디어 콘텐츠(예: 사진이나 동영상)를 표시할 수 있습니다. 이때 앱이 Android 10 이상을 타겟팅하는 한 Android 10(API 수준 29) 이상을 실행하는 기기에서는 READ_EXTERNAL_STORAGE 권한을 사용하지 않아도 됩니다. 그러나 이전 기기와의 호환성을 위해 READ_EXTERNAL_STORAGE 권한을 선언하고 android:maxSdkVersion을 28로 설정할 수 있습니다.
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2025-07-27(UTC)
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["필요한 정보가 없음","missingTheInformationINeed","thumb-down"],["너무 복잡함/단계 수가 너무 많음","tooComplicatedTooManySteps","thumb-down"],["오래됨","outOfDate","thumb-down"],["번역 문제","translationIssue","thumb-down"],["샘플/코드 문제","samplesCodeIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-07-27(UTC)"],[],[],null,["# Declare app permissions\n\nAs mentioned in the [workflow for using\npermissions](/training/basics/permissions#workflow), if your app requests app\npermissions, you must declare these permissions in your app's manifest file.\nThese declarations help app stores and users understand the set of permissions\nthat your app might request.\n\nThe process to request a permission depends on the type of\npermission:\n\n- If the permission is an [install-time\n permission](/guide/topics/permissions/overview#install-time), such as a normal permission or a signature permission, the permission is granted automatically at install time.\n- If the permission is a [runtime\n permission](/guide/topics/permissions/overview#runtime) or [special\n permission](/guide/topics/permissions/overview#special), and if your app is installed on a device that runs Android 6.0 (API level 23) or higher, you must request the [runtime permission](/training/permissions/requesting) or [special\n permission](/training/permissions/requesting-special) yourself.\n\n| **Caution:** Carefully consider which permissions to declare in your app's manifest. Add only the permissions that your app needs. For each permission that your app requests, make sure that it offers clear benefits to users and that the request is done in a way that's obvious to them.\n\nAdd declaration to app manifest\n-------------------------------\n\nTo declare a permission that your app might request, include the appropriate\n[`\u003cuses-permission\u003e`](/guide/topics/manifest/uses-permission-element) element in\nyour app's manifest file. For example, an app that needs to access the camera\nhas this line in `AndroidManifest.xml`: \n\n```xml\n\u003cmanifest ...\u003e\n \u003cuses-permission android:name=\"android.permission.CAMERA\"/\u003e\n \u003capplication ...\u003e\n ...\n \u003c/application\u003e\n\u003c/manifest\u003e\n```\n\nDeclare hardware as optional\n----------------------------\n\nSome permissions, such as\n[`CAMERA`](/reference/android/Manifest.permission#CAMERA), let your app\naccess pieces of hardware that only some Android devices have. If your app\ndeclares one of these [hardware-associated\npermissions](/guide/topics/manifest/uses-feature-element#permissions-features),\nconsider whether your app can still run on a device that doesn't have that\nhardware. In most cases, hardware is optional, so it's better to declare the\nhardware as optional by setting `android:required` to `false` in your\n[`\u003cuses-feature\u003e`](/guide/topics/manifest/uses-feature-element) declaration, as\nshown in the following code snippet from an `AndroidManifest.xml` file: \n\n```xml\n\u003cmanifest ...\u003e\n \u003capplication\u003e\n ...\n \u003c/application\u003e\n \u003cuses-feature android:name=\"android.hardware.camera\"\n android:required=\"false\" /\u003e\n\u003cmanifest\u003e\n```\n| **Caution:** If you don't set `android:required` to `false` in your `\u003cuses-feature\u003e` declaration, Android assumes that the hardware is required for your app to run. The system then [prevents some devices from being able to install your\n| app](/guide/topics/manifest/uses-feature-element#market-feature-filtering).\n\n### Determine hardware availability\n\nIf you declare hardware as optional, it's possible for your app to run on a\ndevice that doesn't have that hardware. To check whether a device has a specific\npiece of hardware, use the\n[`hasSystemFeature()`](/reference/android/content/pm/PackageManager#hasSystemFeature(java.lang.String))\nmethod, as shown in the following code snippet. If the hardware isn't available,\ngracefully disable that feature in your app. \n\n### Kotlin\n\n```kotlin\n// Check whether your app is running on a device that has a front-facing camera.\nif (applicationContext.packageManager.hasSystemFeature(\n PackageManager.FEATURE_CAMERA_FRONT)) {\n // Continue with the part of your app's workflow that requires a\n // front-facing camera.\n} else {\n // Gracefully degrade your app experience.\n}\n```\n\n### Java\n\n```java\n// Check whether your app is running on a device that has a front-facing camera.\nif (getApplicationContext().getPackageManager().hasSystemFeature(\n PackageManager.FEATURE_CAMERA_FRONT)) {\n // Continue with the part of your app's workflow that requires a\n // front-facing camera.\n} else {\n // Gracefully degrade your app experience.\n}\n```\n\nDeclare permissions by API level\n--------------------------------\n\nTo declare a permission only on devices that support runtime permissions---that\nis, devices that run Android 6.0 (API level 23) or higher---include the\n[`\u003cuses-permission-sdk-23\u003e`](/guide/topics/manifest/uses-permission-sdk-23-element)\nelement instead of the\n[`\u003cuses-permission\u003e`](/guide/topics/manifest/uses-permission-element) element.\n\nWhen using either of these elements, you can set the `maxSdkVersion` attribute\nto indicate that devices running a version of Android higher than\nthe specified value don't need a particular permission. This lets you\neliminate unnecessary permissions while still providing compatibility\nfor older devices.\n\nFor example, your app might show media content, such as photos\nor videos, that the user created while in your app. In this situation,\nyou don't need to use the\n[`READ_EXTERNAL_STORAGE`](https://developer.android.com/reference/android/Manifest.permission#READ_EXTERNAL_STORAGE)\npermission on devices that\nrun Android 10 (API level 29) or higher, as long as your app targets\nAndroid 10 or higher. However, for compatibility with older devices,\nyou can declare the `READ_EXTERNAL_STORAGE` permission and set the\n`android:maxSdkVersion` to 28."]]