ちょっと話題の記事

Android Tips #18 インストール可能な端末を限定する

2012.10.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Android プラットフォーム を搭載している製品は実に様々です。スマホからタブレット、はたまたテレビまであります。画面サイズ・画面密度もバラバラで、ガラケーライクなテンキーが付いている機種もあったりします。またバージョンアップも頻繁にあります。 すべての端末で動作することがもちろんベストですが、アプリによってはインストール可能な端末の絞込みが必要になってきます。
そこで今回は インストール可能な端末を限定するための設定方法 を見ていきたいと思います。

AndroidManifest.xml で設定する

AndroidManifest.xml では「アプリが必要としている機能やスペックを持つ端末」を設定することができます。設定項目がいくつかあるので、それぞれ見ていきましょう。

APIレベル(SDKバージョン)

APIレベルは Android プラットフォームのバージョンのことです。SDKバージョンとも呼ばれます。Androidアプリでは、AndroidManifest.xml に インストールできる最小のAPIレベル( android:minSdkVersion )を uses-sdk で指定しなければいけないというルールがあります。ここで指定した最小のAPIレベル以下の端末ではアプリをインストールできません。また、主な対象とするAPIレベル( android:targetSdkVersion )も指定することができます。

例 (Android 2.2 から Android 2.3.3 まで)

<uses-sdk
	android:minSdkVersion="8"
	android:maxSdkVersion="10"
	android:targetSdkVersion="8" />

画面サイズと画面密度の種類

Android端末は画面サイズの大きさ、また画面密度によって大きくグループ化されています。 <supports-screens> によってどの種類の画面サイズ・画面密度の端末でインストールできるか、または除外するか指定することができます。 まず画面サイズの種類を見てみましょう。

small 426dp x 320dp (mdpiで 426px x 320px) が最小
normal 470dp x 320dp (mdpiで 470px x 320px) が最小
large 640dp x 480dp (mdpiで 640px x 480px) が最小
xlarge 960dp x 720dp (mdpiで 960px x 720px) が最小

このような定義で分類されています。dp は端末の画面密度によってピクセル値が変わるので、 dp = px ではないことに注意してください。この種類によって、インストール可能な端末を限定することができます。例えば以下のように指定します。

例 (タブレットなどを除外する場合)

<supports-screens 
	android:smallScreens="true"
	android:normalScreens="true"
	android:largeScreens="false"
	android:xlargeScreens="false" />

ハードウェア

特定のハードウェアが搭載されている端末に限定する場合は、 <uses-configuration> を使います。「ハードウェアキーボードが搭載されている端末」や「トラックボールが搭載されている端末」といったような条件で絞込みが可能です。

例 (QWERTYキーボードが搭載されている端末のみ)

<uses-configuration 
	android:reqKeyboardType="qwerty"
	/>

端末仕様

端末の仕様による制限をかけるには <uses-feature> を使います。「オートフォーカス付きのカメラが搭載されている端末」や「GPSを搭載している端末」などといった条件で絞込みが可能です。

例 (オートフォーカス・フラッシュ機能付きカメラが搭載されている端末のみ)

<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus"/>
<uses-feature android:name="android.hardware.camera.flash"/>

ライブラリ

アプリに必要な共有ライブラリを指定することで、指定のライブラリが含まれていない端末のインストールを制限することができます。制限をかけるには <uses-library> を使います。「GoogleMapライブラリが含まれている端末」などといった条件で絞り込むことができます。この要素は <application> 内に指定します。

例 (GoogleMapライブラリを必要としているアプリ)

<application android:name="MyApplication" >
	<uses-library android:name="com.google.android.maps" />
	...
</application>

GooglePlay Android Developer Console で設定する

特定の端末を除外する

GooglePlay Android Developer Console からは、アプリの編集画面で「特定の端末を除外する」ことができます。
まずはアプリの編集画面を開き、「公開設定のオプション」の一番下の欄を見ます。

この欄の上のほうには AndroidManifest.xml で設定した内容が反映されています。マニフェストファイルに記述した内容で正確に指定できているか確認するときに便利ですね。下部にある「端末を表示」というリンクをクリックすると、端末リストが表示され、特定の端末を除外することができます。

端末の画面サイズ・画面密度を調べる

最後に、端末の解像度や画面サイズを取得するコードを掲載しておきます。 AndroidManifest.xml で対象とするスペックを指定するときに活用しましょう。

画面サイズの種類を取得する

Configuration conf = getResources().getConfiguration();
int size = conf.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
switch (size) {
case Configuration.SCREENLAYOUT_SIZE_SMALL:
	Log.d("TAG", "ScreenLayout : small");
	break;
case Configuration.SCREENLAYOUT_SIZE_NORMAL:
	Log.d("TAG", "ScreenLayout : normal");
	break;
case Configuration.SCREENLAYOUT_SIZE_LARGE:
	Log.d("TAG", "ScreenLayout : large");
	break;
case Configuration.SCREENLAYOUT_SIZE_XLARGE:
	Log.d("TAG", "ScreenLayout : xlarge");
	break;
case Configuration.SCREENLAYOUT_SIZE_UNDEFINED:
	Log.d("TAG", "ScreenLayout : undefined");
	break;
}

画面密度を取得する

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
Log.d("TAG", "Density : " + metrics.density);
Log.d("TAG", "ScaledDensity : " + metrics.scaledDensity);
Log.d("TAG", "DensityDpi : " + metrics.densityDpi);
Log.d("TAG", "XDpi : " + metrics.xdpi);
Log.d("TAG", "YDpi : " + metrics.ydpi);
Log.d("TAG", "WidthPixels : " + metrics.widthPixels);
Log.d("TAG", "HeightPixels : " + metrics.heightPixels);
switch (metrics.densityDpi) {
case DisplayMetrics.DENSITY_LOW:
	Log.d("TAG", "DensityName : ldpi");
	break;
case DisplayMetrics.DENSITY_MEDIUM:
	Log.d("TAG", "DensityName : mdpi");
	break;
case DisplayMetrics.DENSITY_HIGH:
	Log.d("TAG", "DensityName : hdpi");
	break;
case DisplayMetrics.DENSITY_XHIGH:
	Log.d("TAG", "DensityName : xhdpi");
	break;
case DisplayMetrics.DENSITY_XXHIGH:
	Log.d("TAG", "DensityName : xxhdpi");
	break;
case DisplayMetrics.DENSITY_TV:
	Log.d("TAG", "DensityName : tvdpi");
	break;
}

まとめ

アプリの仕様や機能によっては、インストールすべきではない端末が必ず存在します。 アプリが必要とする端末の機能・スペックを明確にし、対象となる端末以外で誤ってインストールされないようにしましょう。

参考