Normal Permissionは、Androidにおいてシステムがユーザーに確認せず自動的に付与するパーミッションのカテゴリです。Android Developer Documentation, 2024によると、ノーマルパーミッションはProtectionLevel normalを持ち、危険なパーミッションとは異なり実行時ダイアログを必要としません。これらはインターネット、ネットワーク状態、バイブレーションへのアクセスをカバーし、ユーザーの機密データにリスクをもたらしません。
重要なポイント
Normal Permissionは、AndroidにおいてProtectionLevel normalを持つシステムパーミッションの一種で、インストール時にアプリケーションに自動的に付与されます。開発者はこれをリクエストするためのコードを書く必要はありません — AndroidManifest.xmlでパーミッションを宣言するだけで十分です。ユーザーはダイアログを表示されず、通常のパーミッションを個別に取り消すことはできず、アプリケーション全体をアンインストールするしかありません。
Androidシステムはノーマルパーミッションを低リスクとして分類しています — これらは個人データ、カメラ、マイクへのアクセスを提供しません。典型的な例:インターネットアクセス、バイブレーション制御、Wi-Fi状態の読み取り。Android Security Model(2024)によると、全システムパーミッションの約40パーセントがノーマルカテゴリに属しています。
重要な特性 — ノーマルパーミッションは設定から実行時に取り消すことができません。ユーザーがアクセスを拒否したい場合、唯一の方法はアプリケーションをアンインストールすることです。開発者はアーキテクチャでこれを考慮する必要がありますが、ユーザーにとってはこのアプローチにより対話が簡素化されます:初回起動時にダイアログはありません。
ノーマルパーミッションと危険なパーミッションへの分割は、Android 6.0 Marshmallow(API 23)で登場しました。このバージョン以前は、すべてのパーミッションがインストール時にリクエストされていました — ユーザーは単一のリストを見て、全体として受け入れるか拒否していました。Normal Permissionは低リスク操作のためにこのモデルを維持し、Dangerousは実行時リクエストに移行しました。この変更によりユーザーエクスペリエンスが向上し、同時にセキュリティも強化されました。
多くのAndroidシステムAPIは、アクセスが自動的であっても、通常のパーミッションの明示的な宣言を必要とします。たとえば、ConnectivityManagerクラスはACCESS_NETWORK_STATEを必要とし、VibratorServiceはVIBRATEを、WifiManagerはACCESS_WIFI_STATEを必要とします。対応するuses-permissionを宣言せずにこれらのAPIを呼び出すと、SecurityExceptionが発生します。
ProtectionLevel normalは、Androidパーミッションシステムにおける最小の保護レベルです。このレベルのパーミッションはマニフェストで宣言され、システムはインストール時に宣言を確認し、ユーザーの介入なしにアクセスを許可します。UI要素は表示されず、コールバックも呼び出されません。
検証メカニズムはPackageManagerレベルで機能します。APKインストール中、システムはすべてのuses-permissionタグをスキャンし、permissions.xmlファイルのシステム定義と照合して各パーミッションの保護レベルを判別し、normalレベルの場合は単にアクセスを登録します。このプロセスはミリ秒単位で完了し、ユーザーインターフェースとの対話は必要ありません。
付与アルゴリズムは次のように機能します:
ユーザーはインターフェースを通じて通常のパーミッションを取り消すことはできません。アプリケーション設定のパーミッションセクションには、危険なパーミッションのみが表示されます。これは、機能の感度レベルに関係なくすべてのパーミッションに個別の確認が必要なiOSとは対照的です。
NormalおよびDangerous Permissionは、Androidにおけるセキュリティの2つの対照的なカテゴリです。主な違いは付与方法にあります:ノーマルパーミッションはインストール時に自動的に付与され、危険なパーミッションは実行時ダイアログを通じて明示的な同意を必要とします。この区別はAndroid 6.0 Marshmallow以降、Androidのセキュリティアーキテクチャに組み込まれています。
主要な特性の比較:
| 特性 | Normal Permission | Dangerous Permission |
|---|---|---|
| ProtectionLevel | normal | dangerous |
| ユーザーへのリクエスト | 不要 | 実行時ダイアログ必須 |
| 取り消し可能性 | 不可、アンインストールのみ | 可能、いつでも設定から |
| コード内チェック | 常にPERMISSION_GRANTED | checkSelfPermission必須 |
| 例 | INTERNET、VIBRATE、ACCESS_NETWORK_STATE | CAMERA、RECORD_AUDIO、ACCESS_FINE_LOCATION |
ユーザーはNormal Permissionをリクエストする際にダイアログを一切表示されません。アプリがINTERNETを必要とする場合 — 静かに取得します。Dangerous Permissionの場合、システムはリクエストされたアクセスの説明を含むモーダルダイアログを表示します。ユーザーは許可または拒否を押し、後でいつでも設定からパーミッションを取り消すことができます。これはインターフェース開発戦略を決定する重要なUXの違いです。
Normalは、アクセスが機密データに関係しないすべての場合に使用する必要があります。接続確認のためのACCESS_NETWORK_STATE、触覚フィードバックのためのVIBRATE、HTTPリクエストのためのINTERNET — これらはすべてノーマルパーミッションです。normalで十分な場合にdangerousレベルを使用することは悪い慣行であり、不要なダイアログを作成し、アプリケーションに対するユーザーの信頼を低下させます。
Androidは数十のノーマルパーミッションを定義しており、それぞれが特定のシステム機能に対応しています。これらはすべてManifest.permissionクラスの定数を通じて利用可能です。以下はアプリケーション開発で最もよく使用されるもののリストです。
| 定数 | アクセス | 説明 |
|---|---|---|
| INTERNET | ネットワーク | HTTPリクエストのためのネットワークソケットを開く |
| ACCESS_NETWORK_STATE | ネットワーク | ネットワーク状態に関する情報を取得する |
| ACCESS_WIFI_STATE | Wi-Fi | Wi-Fi接続に関する情報を読み取る |
| VIBRATE | バイブレーション | デバイスのバイブレーターを制御する |
| BLUETOOTH | Bluetooth | Bluetoothデバイスに接続する |
| WAKE_LOCK | 電源 | プロセッサのスリープ移行を防ぐ |
| SET_ALARM | アラーム | AlarmManagerを使用してアラームを設定する |
| CHANGE_NETWORK_STATE | ネットワーク | ネットワーク接続状態を変更する |
ノーマルパーミッションはUI表示目的でPermission Groupにグループ化されません。Androidのグループは設定画面用であり、危険なパーミッションのみが表示されます。ただし、ノーマルパーミッションは論理的にカテゴリに分類できます:ネットワーク(INTERNET、ACCESS_NETWORK_STATE)、ハードウェア(VIBRATE、WAKE_LOCK)、システム(SET_ALARM)、Bluetoothパーミッション。
Manifest.permissionの一部の定数は、Androidのバージョンによって保護レベルが変わることがあります。たとえば、BLUETOOTH_CONNECTはAndroid 12以降で実行時リクエストが必要な危険なパーミッションになりましたが、古いバージョンではノーマルでした。開発者はドキュメントを通じて対象APIの現在のprotectionLevelを確認することを推奨します。
開発者はPackageManagerを使用して、プログラムでパーミッションがノーマルかどうかを確認できます。getPermissionInfoメソッドは、protectionLevelフィールドにPermissionInfo.PROTECTION_NORMALフラグを含むPermissionInfoを返します。これは動的ハンドリングとデバッグに役立ちます。
fun isNormalPermission(permission: String): Boolean {
val pm = packageManager
val info = pm.getPermissionInfo(
permission,
PackageManager.GET_META_DATA
)
return info.protectionLevel ==
PermissionInfo.PROTECTION_NORMAL
}
Normal Permissionの宣言はAndroidManifest.xmlでの最も簡単な操作で、1つのuses-permissionタグのみが必要です。保護レベルはシステム定義によって決定され、アプリケーションマニフェストではないため、追加のprotectionLevel設定は不要です。開発者は単に定数の完全な名前を指定します。
<!-- AndroidManifest.xml -->
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission
android:name="android.permission.VIBRATE" />
システムはインストール時にすべての宣言を処理します。宣言されたパーミッションの少なくとも1つがnormalと異なるprotectionLevelを持つ場合、実行時リクエストが必要になります。INTERNETは最も人気のあるノーマルパーミッションであり、特にHTTPリクエストを実行したりネットワークからコンテンツをロードしたりする、ほとんどのAndroidアプリケーションに存在します。
ノーマルパーミッションと危険なパーミッションを含むAndroidManifest.xmlの完全な例は、その違いを示しています:構文的にはuses-permissionタグは同じですが、実行時にINTERNETとVIBRATEは自動的に許可され、CAMERAはダイアログが必要になります。
<manifest
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Normal permissions -->
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.VIBRATE" />
<!-- Dangerous permission -->
<uses-permission
android:name="android.permission.CAMERA" />
</manifest>
ライブラリ(Google Play Services、Firebase、Glide)を使用する場合、それらはManifest Mergerを通じて独自のuses-permissionを最終マニフェストに追加することがあります。一部はノーマル(FirebaseのINTERNET)、他は危険(Google MapsのACCESS_FINE_LOCATION)です。公開前に、開発者はbuild/outputs/logs/manifest-merger-report.txtで最終的なマージ済みマニフェストを確認する必要があります。
Normal Permissionには2つの基本的な制限があります:ユーザーによる取り消しが不可能なことと、管理UIがないことです。ユーザーがアプリケーションを信頼していないが、ノーマルパーミッションが既に自動的に付与されている場合 — 唯一の解決策はアプリケーションをアンインストールすることです。これにより、ノーマルパーミッションはAndroidの標準的な手段ではブロックできないため、一定のリスクが生じます。
追加の制限は、複数のプロファイル(Work Profile、Multiple Users)を持つデバイスで現れます。Normal Permissionはすべてのプロファイルに同時に付与されます — アプリケーションはパーミッションを1つだけに制限できません。エンタープライズシナリオでは、Managed Configurationsを通じて解決されます。
アプリケーションが特定の時点でNormal Permissionを使用しているかどうかを確認することはできません。システムメソッドcheckSelfPermissionは危険なパーミッションに対してのみ機能します。ノーマルパーミッションの場合、常にPERMISSION_GRANTEDを返し、実際のアクティビティを反映しません。これはセキュリティ監査やアプリケーション動作分析の際に考慮する必要があります。
また、一部のデバイスメーカー(Xiaomi、Huawei、Samsung)はパーミッションの標準的な動作を変更することにも注意が必要です。それらのファームウェアでは、Normal PermissionにMIUIやEMUIの独自シェルで追加のパーミッションが必要になる場合があります。開発者は異なるベンダーの実機でのテストを推奨します。
よくある質問
Normal Permissionはインストール時にダイアログなしで自動的に付与されます。Dangerousはユーザーの明示的な同意を得るための実行時リクエストが必要で、設定から取り消すことができます。NormalはProtectionLevel normalを使用し、DangerousはprotectionLevel dangerousを使用します。
いいえ、ノーマルパーミッションの場合はAndroidManifest.xmlでuses-permissionを宣言するだけで十分です。リクエストコードは不要です — システムが自動的にアクセスを許可します。これにより、ActivityCompat.requestPermissionsが必要な危険なパーミッションと区別されます。
最もよく使用されるもの:INTERNET(ネットワークリクエスト)、ACCESS_NETWORK_STATE(接続確認)、VIBRATE(触覚フィードバック)、WAKE_LOCK(プロセッサを起動状態に保つ)。ほとんどすべてのAndroidアプリケーションが少なくともINTERNETを使用しています。
いいえ、Normal Permissionはアプリケーション設定から取り消すことはできません。アクセスを停止する唯一の方法はアプリケーションをアンインストールすることです。これは、ユーザーがいつでも無効にできる危険なパーミッションとの重要な違いです。
PackageManager.getPermissionInfoを使用し、パーミッションの文字列名を渡します。メソッドはprotectionLevelフィールドを持つPermissionInfoを返します。カテゴリを判別するには、PermissionInfo.PROTECTION_NORMALまたはPROTECTION_DANGEROUS定数と比較します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。