<uses-permission>設定の罠

<uses-permission>

Androidアプリが特定の機能を利用する場合、AndroidManifest.xmlにその機能の一覧を<uses-permission>として記述します。 たとえば、マイクによる録音を行うアプリの場合、以下の様な記述が必要となります。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.nein37.kanidaisuki" >
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

この<uses-permission>の定義はアプリの中で使用する全ての機能に関して記述します。 <uses-permission>の内容はPlayストアのアプリページに記載され、その機能が重要なものであればインストール時に権限を許可しても良いかを確認するダイアログが表示されます。

<uses-feature>

Androidアプリが特定の機能を必要とする場合、AndroidManifest.xmlにその機能の一覧を<uses-feature>として記述します。 必要とするというのは、例えばOpenGL ESの特定のVersion以降が必要であるとか、カメラ機能が必須であるという場合です。 たとえば、マイク機能が必須であるアプリは以下の様な記述が必要となります。 (この記述だけでは録音機能を使うことはできませんが、マイクは必須となります)

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.nein37.kanidaisuki" >
    <uses-feature android:name="android.hardware.microphone" android:required="true" />

この<uses-feature>情報はPlayストアには記載されません。 <uses-feature>を満たしている端末の場合、Playストア上から何の問題もなくインストールされます。 このとき、<uses-permission>と違い、特に確認ダイアログなどは表示されません。 <uses-feature>を満たしていない端末の場合、そもそもアプリがPlayストア上に表示されません。 ブラウザ版から該当端末にインストールしようとした場合でも「お使いの端末にはインストールできません」という旨のメッセージが表示され、インストールすることができません。

2つの設定の違い

<uses-permission>と<uses-feature>の違いは、それがチェックされるタイミングになります。 <uses-permission>がアプリを許可するかどうかをユーザに判断させているのに対し、 <uses-feature>はそもそもアプリがインストール可能かどうかをPlayストアが判定しています。 <uses-feature>の設定を失敗すると潜在的なアプリユーザを狭めてしまうので、要注意です。

<uses-permission>の罠

<uses-permission>を設定した時、その機能が参照するハードウェア機能の<uses-feature>が暗黙的に設定されます。

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

上記の設定は、Playストア上では以下のように解釈されます。

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-feature android:name="android.hardware.microphone" android:required="true" />

通常、上記のような場合はあまり問題になることはありません。 録音機能を利用するためにマイクが必要なのは当然だからです。 しかし、次の様な場合もあります。

このアプリはメモ録音と文字起こしのためにマイク機能を利用します。しかし必須ではありません。 マイクがない端末でもキーボードによる文字入力で代替したいです。

この時、<uses-permission>だけ設定してしまうと、<uses-feature>も補完されてしまい、マイクがない端末にはインストールできなくなってしまいます。 このように<uses-permission>が必須機能でない場合、以下のように記述します。

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-feature android:name="android.hardware.microphone" android:required="false" />

これでこのアプリにマイクは必須ではないと宣言することができました。 マイクのない端末でもインストールできるようになります。 ただし、実行時にマイクがあるかどうかを判定する必要があるので注意が必要です。

おまけ

<uses-permission>と<uses-feature>の対応表はAndroid Developersの以下のページに書いてあります。 http://developer.android.com/guide/topics/manifest/uses-feature-element.html#permissions