AndroidのNormal Permission — その概要、保護レベル、動作原理

著者: IT Sectr 公開日: 2026-05-20 読了時間: 8 分

Normal Permissionは、Androidにおいてシステムがユーザーに確認せず自動的に付与するパーミッションのカテゴリです。Android Developer Documentation, 2024によると、ノーマルパーミッションはProtectionLevel normalを持ち、危険なパーミッションとは異なり実行時ダイアログを必要としません。これらはインターネット、ネットワーク状態、バイブレーションへのアクセスをカバーし、ユーザーの機密データにリスクをもたらしません。

重要なポイント

  • Normal Permissionは、ProtectionLevel normalを持つAndroidパーミッションのカテゴリで、インストール時に自動的に付与されます。
  • 使用するにはマニフェストにuses-permissionを追加するだけで十分です — ユーザーにダイアログは表示されません。
  • 危険なパーミッションとの主な違いは、実行時リクエストが不要で、設定から取り消せないことです。
  • リストにはINTERNET、ACCESS_NETWORK_STATE、VIBRATE、ACCESS_WIFI_STATEなどのシステム定数が含まれます。
  • アプリケーションコードでPackageManager.getPermissionInfoを使用して保護レベルを確認できます。

AndroidのNormal Permissionとは

Normal Permissionは、AndroidにおいてProtectionLevel normalを持つシステムパーミッションの一種で、インストール時にアプリケーションに自動的に付与されます。開発者はこれをリクエストするためのコードを書く必要はありません — AndroidManifest.xmlでパーミッションを宣言するだけで十分です。ユーザーはダイアログを表示されず、通常のパーミッションを個別に取り消すことはできず、アプリケーション全体をアンインストールするしかありません。

Androidシステムはノーマルパーミッションを低リスクとして分類しています — これらは個人データ、カメラ、マイクへのアクセスを提供しません。典型的な例:インターネットアクセス、バイブレーション制御、Wi-Fi状態の読み取り。Android Security Model(2024)によると、全システムパーミッションの約40パーセントがノーマルカテゴリに属しています。

重要な特性 — ノーマルパーミッションは設定から実行時に取り消すことができません。ユーザーがアクセスを拒否したい場合、唯一の方法はアプリケーションをアンインストールすることです。開発者はアーキテクチャでこれを考慮する必要がありますが、ユーザーにとってはこのアプローチにより対話が簡素化されます:初回起動時にダイアログはありません。

カテゴリの歴史

ノーマルパーミッションと危険なパーミッションへの分割は、Android 6.0 Marshmallow(API 23)で登場しました。このバージョン以前は、すべてのパーミッションがインストール時にリクエストされていました — ユーザーは単一のリストを見て、全体として受け入れるか拒否していました。Normal Permissionは低リスク操作のためにこのモデルを維持し、Dangerousは実行時リクエストに移行しました。この変更によりユーザーエクスペリエンスが向上し、同時にセキュリティも強化されました。

どのAPIがNormal Permissionを必要とするか

多くのAndroidシステムAPIは、アクセスが自動的であっても、通常のパーミッションの明示的な宣言を必要とします。たとえば、ConnectivityManagerクラスはACCESS_NETWORK_STATEを必要とし、VibratorServiceはVIBRATEを、WifiManagerはACCESS_WIFI_STATEを必要とします。対応するuses-permissionを宣言せずにこれらのAPIを呼び出すと、SecurityExceptionが発生します。

ProtectionLevel normalの仕組み

ProtectionLevel normalは、Androidパーミッションシステムにおける最小の保護レベルです。このレベルのパーミッションはマニフェストで宣言され、システムはインストール時に宣言を確認し、ユーザーの介入なしにアクセスを許可します。UI要素は表示されず、コールバックも呼び出されません。

検証メカニズムはPackageManagerレベルで機能します。APKインストール中、システムはすべてのuses-permissionタグをスキャンし、permissions.xmlファイルのシステム定義と照合して各パーミッションの保護レベルを判別し、normalレベルの場合は単にアクセスを登録します。このプロセスはミリ秒単位で完了し、ユーザーインターフェースとの対話は必要ありません。

付与アルゴリズムは次のように機能します:

  • システムはアプリケーションインストール時にマニフェストを読み取ります
  • デバイスの/etc/permissions/でprotectionLevelを照合します
  • 値がnormalの場合 — 自動的にアクセスを許可します
  • パーミッションはアプリケーションが完全にアンインストールされるまでアクティブなままです

ユーザーはインターフェースを通じて通常のパーミッションを取り消すことはできません。アプリケーション設定のパーミッションセクションには、危険なパーミッションのみが表示されます。これは、機能の感度レベルに関係なくすべてのパーミッションに個別の確認が必要なiOSとは対照的です。

Normal Permission vs Dangerous Permission

NormalおよびDangerous Permissionは、Androidにおけるセキュリティの2つの対照的なカテゴリです。主な違いは付与方法にあります:ノーマルパーミッションはインストール時に自動的に付与され、危険なパーミッションは実行時ダイアログを通じて明示的な同意を必要とします。この区別はAndroid 6.0 Marshmallow以降、Androidのセキュリティアーキテクチャに組み込まれています。

主要な特性の比較:

特性Normal PermissionDangerous Permission
ProtectionLevelnormaldangerous
ユーザーへのリクエスト不要実行時ダイアログ必須
取り消し可能性不可、アンインストールのみ可能、いつでも設定から
コード内チェック常にPERMISSION_GRANTEDcheckSelfPermission必須
INTERNET、VIBRATE、ACCESS_NETWORK_STATECAMERA、RECORD_AUDIO、ACCESS_FINE_LOCATION

ユーザーリクエストの違い

ユーザーはNormal Permissionをリクエストする際にダイアログを一切表示されません。アプリがINTERNETを必要とする場合 — 静かに取得します。Dangerous Permissionの場合、システムはリクエストされたアクセスの説明を含むモーダルダイアログを表示します。ユーザーは許可または拒否を押し、後でいつでも設定からパーミッションを取り消すことができます。これはインターフェース開発戦略を決定する重要なUXの違いです。

Normalを選ぶべき場合

Normalは、アクセスが機密データに関係しないすべての場合に使用する必要があります。接続確認のためのACCESS_NETWORK_STATE、触覚フィードバックのためのVIBRATE、HTTPリクエストのためのINTERNET — これらはすべてノーマルパーミッションです。normalで十分な場合にdangerousレベルを使用することは悪い慣行であり、不要なダイアログを作成し、アプリケーションに対するユーザーの信頼を低下させます。

Androidのノーマルパーミッション一覧

Androidは数十のノーマルパーミッションを定義しており、それぞれが特定のシステム機能に対応しています。これらはすべてManifest.permissionクラスの定数を通じて利用可能です。以下はアプリケーション開発で最もよく使用されるもののリストです。

定数アクセス説明
INTERNETネットワークHTTPリクエストのためのネットワークソケットを開く
ACCESS_NETWORK_STATEネットワークネットワーク状態に関する情報を取得する
ACCESS_WIFI_STATEWi-FiWi-Fi接続に関する情報を読み取る
VIBRATEバイブレーションデバイスのバイブレーターを制御する
BLUETOOTHBluetoothBluetoothデバイスに接続する
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によるNormal Permissionの確認

開発者はPackageManagerを使用して、プログラムでパーミッションがノーマルかどうかを確認できます。getPermissionInfoメソッドは、protectionLevelフィールドにPermissionInfo.PROTECTION_NORMALフラグを含むPermissionInfoを返します。これは動的ハンドリングとデバッグに役立ちます。

kotlin
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の宣言方法

Normal Permissionの宣言はAndroidManifest.xmlでの最も簡単な操作で、1つのuses-permissionタグのみが必要です。保護レベルはシステム定義によって決定され、アプリケーションマニフェストではないため、追加のprotectionLevel設定は不要です。開発者は単に定数の完全な名前を指定します。

xml
<!-- 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はダイアログが必要になります。

xml
<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>

Manifest MergerとNormal Permission

ライブラリ(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の制限

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 Permissionはインストール時にダイアログなしで自動的に付与されます。Dangerousはユーザーの明示的な同意を得るための実行時リクエストが必要で、設定から取り消すことができます。NormalはProtectionLevel normalを使用し、DangerousはprotectionLevel dangerousを使用します。

Normal Permissionにコードを書く必要がありますか?

いいえ、ノーマルパーミッションの場合はAndroidManifest.xmlでuses-permissionを宣言するだけで十分です。リクエストコードは不要です — システムが自動的にアクセスを許可します。これにより、ActivityCompat.requestPermissionsが必要な危険なパーミッションと区別されます。

最も人気のあるNormal Permissionは?

最もよく使用されるもの:INTERNET(ネットワークリクエスト)、ACCESS_NETWORK_STATE(接続確認)、VIBRATE(触覚フィードバック)、WAKE_LOCK(プロセッサを起動状態に保つ)。ほとんどすべてのAndroidアプリケーションが少なくともINTERNETを使用しています。

Normal Permissionは取り消せますか?

いいえ、Normal Permissionはアプリケーション設定から取り消すことはできません。アクセスを停止する唯一の方法はアプリケーションをアンインストールすることです。これは、ユーザーがいつでも無効にできる危険なパーミッションとの重要な違いです。

パーミッションのProtectionLevelを確認するには?

PackageManager.getPermissionInfoを使用し、パーミッションの文字列名を渡します。メソッドはprotectionLevelフィールドを持つPermissionInfoを返します。カテゴリを判別するには、PermissionInfo.PROTECTION_NORMALまたはPROTECTION_DANGEROUS定数と比較します。

まとめ

  • Normal PermissionはProtectionLevel normalを持つAndroidパーミッションのカテゴリで、インストール時に自動的に付与されます。
  • 宣言には、実行時コードなしでAndroidManifest.xmlのuses-permissionタグで十分です。
  • 危険なパーミッションとは、ダイアログがないこと、取り消し不可、低リスクレベルで異なります。
  • 最も人気のあるもの:INTERNET、ACCESS_NETWORK_STATE、VIBRATE、ACCESS_WIFI_STATE、WAKE_LOCK。
  • ProtectionLevelはコードでPackageManager.getPermissionInfoを使用して確認されます。
  • ノーマルパーミッションはアプリケーション設定画面に表示されません。
  • ライブラリを使用する場合は、Manifest Mergerで最終マニフェストを確認してください。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください