【Androidアプリ開発】パーミッション(権限)の概要と一覧

パーミッションのアイキャッチ画像 プログラミング

はじめに

 本記事ではAndroidアプリ開発における、パーミッション(権限)についての説明と一覧を紹介したいと思います。

パーミッション(権限)とは

 Androidアプリ開発における、パーミッション(権限)とは、アプリを利用するユーザーを保護するために、特定の機能に対してアクセス保護を行うためのものです。例えば、ユーザーの連絡先情報やカメラやBluetoothなど該当します。これらをユーザーの許可なしに勝手にアプリが利用してはプライバシーに影響が出ると同時に、犯罪に繋がる恐れがあります。以下パーミッションを権限と呼びます。


 Android 6.0まではGoogle Playのインストール時に、取得したい権限を表示すればよかったのですが、Android 6.0以降は特定の権限に関しては、アプリ内で同意を取る必要があります。皆さんも下記画面は見たことがあるのではないでしょうか。こちらが同意されると、アプリに対して権限が付与されるという仕組みになります。

ランタイムパーミッションの画面
権限同意画面

 また、権限は好き放題つけていいわけではなく、使うものだけにしましょう。例えば位置情報を利用しないアプリなのに、位置情報の権限をしてはいけません。セキュリティの面やユーザーを守るためにも必要な権限のみをつけましょう。

必要な権限のみ取得するようにしよう!

パーミッション(権限)の使い方

 続いて、権限を実際にどうやって使っていくのかを説明します。まず記載する場所ですが、AndroidManifest.xmlに記載していきます。下記がAndroidManifest.xmlの画面ですが、
<uses-permission>というタグが見えるかと思います。こちらを利用して権限の宣言をしていきます。また、その他にも設定できるオプションがありますので、合わせて説明します。

AndroidManifestのパーミッション宣言
AndroidManifest.xmlのパーミッション宣言

<uses-permission>

 まず先ほども紹介した、<uses-permission>タグについてです。こちらは利用したい権限を宣言することで、アプリに該当の権限を付与できるタグです。例えばインターネットを利用する場合は、以下のように宣言します。

<uses-permission android:name="android.permission.INTERNET" />

 また、外部ストレージに書き込み権限を付与するためには以下のように記載します。

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

 見てみるとおわかりになると思いますが、INTERNETというキーワードと、WRITE_EXTERNAL_STORAGEの名前が違うだけですよね。これが該当の権限のキーワードということになります。

<uses-feature>

 続いて、<uses-feature>タグについてです。こちらはハードウェアやソフトウェアの機能要件を満たさない端末からアプリをフィルタします。例えば、Bluetoothを利用するアプリが、Bluetoothが搭載されていない端末(最近はあまりありませんが)に対してダウンロードされても利用することが出来ませんので、このような場合、Google Playの配信端末から排除することが出来ます

 具体的に利用する場合は、下記のようにAndroidManifest.xmlに記述します。

<uses-feature android:name="android.hardware.bluetooth" />

保護レベル

 権限には保護レベルという考え方が存在します。保護レベルとは各権限に対してGoogleが危険性を判断し、定義づけているものです。具体的には各権限は“normal” , “dangerous”, “signature”, に振り分けられています。それぞれについて説明します。
 ※signatureOrSystemというレベルもありますが、今回は省きます。

normal

 normalとはその名の通り、低リスクとみなされている権限につけられています。これが付けられている権限はユーザに対して同意を取得する必要はなく、インストール時に表示しておくだけで、アプリは権限を取得することが可能になります
 例えばACCESS_NETWORK_STATEという権限は、アプリケーションがネットワークの状態を取得するための権限になりますが、これを取得されてもユーザーは大きなリスクを追わないため、normalとなります。

dangerous

 dangerousとは、危険という意味ですが、こちらは該当権限を利用するとユーザーに悪影響があると考えられる権限に対して付けられています。例えば、CAMERAという権限はアプリがカメラにアクセスできるようになる権限ですが、カメラ機能はユーザーのプライバシーに大きな影響を与えるものになるため、ユーザーの同意がなければ利用しようしてはいけないと考えれられ、dangerousに指定されています。

signature

 signatureは通常の権限ではなく、システム権限と呼ばれる端末を製造しているメーカーが作成した権限で特定の機能を利用できるようにした権限です。例えばDELETE_PACKAGESという、他のアプリを消すことができる権限は、かなり強力ですよね。この権限を持ったアプリが、他のアプリを勝手に削除してしまっては大変なことになるので、signatureが付けられています。
 基本的には端末を製造しているメーカーが作るアプリなどに、特定の機能が必要な場合のみメーカー署名が使われて、権限が使われることや、ルート化されている端末に対しては利用することが可能になります。(一般に売られている端末はルート化されていませんが、脱獄という方法が使える場合があります)

パーミッション(権限)一覧

 続いて、権限はたくさんありますので、覚えられない方も多くいると思います(私もあまりお覚えていません)。ここに主要な権限の一覧を記載しておきますので、お気に入りなどに入れ必要な時に見て頂ければと思います。

パーミッション保護レベル説明
ACCESS_NETWORK_STATEnormalアプリケーションがネットワークに関する情報にアクセスできるようにします。
ACCESS_WIFI_STATEnormalアプリケーションがWi-Fiネットワークの情報にアクセスできるようにします。
BLUETOOTHnormalアプリケーションとペアリングされたBluetooth機器との接続を可能にします。
CHANGE_NETWORK_STATEnormalアプリケーションがネットワークの接続状態を変更できるようにします。
CHANGE_WIFI_STATEnormalアプリケーションによるWi-Fi接続状態の変更を可能にします。
FOREGROUND_SERVICEnormal通常のアプリケーションがService.startForegroundを使用できるようにします。
INTERNETnormalアプリケーションがネットワークソケットを開くことを可能にします。
KILL_BACKGROUND_PROCESSESnormalアプリケーションがActivityManager.killBackgroundProcesses(String)を
呼び出せるようにします。
MODIFY_AUDIO_SETTINGSnormalアプリケーションがグローバルなオーディオ設定を変更することができます。
NFCnormalアプリケーションがNFC上でI/O操作を行うことができます。
NFC_PREFERRED_PAYMENT_INFOnormalアプリケーションがNFC優先決済サービス情報を受信できるようにします。
NFC_TRANSACTION_EVENTnormalアプリケーションがNFCトランザクションイベントを受信できるようにします。
QUERY_ALL_PACKAGESnormalマニフェストの宣言に関係なく、デバイス上の通常のアプリの問い合わせを可能にします。
SET_ALARMnormalアプリケーションが、ユーザーにアラームを設定するIntentを
ブロードキャストすることができます。
TRANSMIT_IRnormalデバイスのIRトランスミッターがある場合は、それを使用できます。
USE_BIOMETRICnormalデバイスがサポートするバイオメトリックモダリティをアプリで使用できるようにします。
VIBRATEnormalバイブレーターへのアクセスを可能にします。
WAKE_LOCKnormalPowerManagerのWakeLocksを使って、プロセッサのスリープや画面の輝度低下を
防ぐことができます。
ACCESS_BACKGROUND_LOCATIONdangerousアプリがバックグラウンドで位置情報にアクセスすることを許可します。
この許可を要求する場合は、ACCESS_COARSE_LOCATIONまたは
ACCESS_FINE_LOCATIONのいずれかも要求する必要があります。
この許可を要求するだけでは、位置情報へのアクセスはできません。
ACCESS_COARSE_LOCATIONdangerousアプリがおおよその位置情報にアクセスできるようにします。代わりにACCESS_FINE_LOCATIONを指定することもできます。
ACCESS_FINE_LOCATIONdangerousアプリが正確な位置情報にアクセスできるようにします。代わりにACCESS_COARSE_LOCATIONを指定することもできます。
ANSWER_PHONE_CALLSdangerous着信した電話にアプリが応答できるようにします。
BODY_SENSORSdangerous心拍数など、ユーザーが体の中で起こっていることを測定するために
使用するセンサーからのデータに、アプリケーションがアクセスできるようにします。
CALL_PHONEdangerousユーザーが電話を確認するためのダイアラーユーザーインターフェースを経由せずに、アプリケーションから電話をかけることができます。
CAMERAdangerousこれにより、すべてのカメラ機能に対して uses-feature マニフェスト要素が
自動的に適用されます。すべてのカメラ機能を必要としない場合や、
カメラが利用できない場合でも適切に動作する場合は、すべてのカメラ機能を
サポートしていないデバイスにインストールするために、
マニフェストを適切に変更する必要があります。
READ_CONTACTSdangerousアプリケーションがユーザーの連絡先データを読み取ることを許可します。
READ_EXTERNAL_STORAGEdangerousアプリケーションが外部ストレージからの読み取りを可能にします。
READ_PHONE_STATEdangerous現在の携帯電話ネットワーク情報、進行中の通話のステータス、
デバイスに登録されているPhoneAccountsのリストなど、
電話の状態への読み取り専用のアクセスを許可します。
READ_SMSdangerousアプリケーションがSMSメッセージを読むことを許可します。
WRITE_EXTERNAL_STORAGEdangerousアプリケーションによる外部ストレージへの書き込みを許可します。
主要パーミッション一覧

カスタム権限について

 カスタム権限とは、アプリ開発者自身が権限を作成し、機能を制限できる機能のことです。カスタム権限を定義すると、他のアプリとリソースや機能の共有をすることが可能になります。
 例えば、通常アプリは他のアプリを起動させることが可能なのですが、他のアプリから自分のアプリを起動されたくないような場合に、カスタム権限を持っている他のアプリのみ自分のアプリを起動することが出来るような権限を作ることが出来ます。以下が例になります。

    <permission
        android:name="com.example.myapplication.MY_PERMISSION"
        android:label="@string/permissoion_label"
        android:description="@string/permission_description"
        android:permissionGroup="android.permission-group.COST_MONEY"
        android:protectionLevel="normal" />

 これで定義が完成しましたので、これを利用したい場合には、他のアプリから以下のようにりようすることで、カスタム権限を利用することができるようになります。

    <uses-permission android:name="com.example.myapplication.MY_PERMISSION" />

まとめ

 本記事ではAndroidアプリ開発における、パーミッション(権限)の概要や、使い方、主要なパーミッション一覧、カスタム権限について説明しました。
 Androidアプリ開発では昨今のプライバシーの規制も相まって、必ず権限については確認し、適切に利用することが必要ですので、ぜひ覚えましょう。

コメント