Androidアプリケーション技術者認定試験ベーシックの試験範囲の知識をまとめた(5)

# リソースファイル

## AndroidManifestファイル

AndroidMnifestファイルはすべてのアプリケーションに必要なファイルで、XML形式で作成する。

### AndroidManifest.xmlが持つアプリケーションの情報

- パッケージ名
- コンポーネントの構成
- セキュリティがかけられた部品へアクセスするためのリクエスト
- 自身の部品へアクセスするためにかけるセキュリティ
- テスト時に利用する情報
- 動作させる最小のAPIレベル
- 必要とするライブラリ

### AndroidManifest.xmlのファイル内容

|||
|---|---|
|`<manifest>`|ルートタグ|
|`<application>`|アプリケーション全体の設定|
|`<activity>`|アプリケーションに含まれるアクティビティ|
|`<service>`|アプリケーションに含まれるサービス|
|`<reciver>`|アプリケーションに含まれるブロードキャストレシーバ|
|`<provider>`|アプリケーションに含まれるコンテントプロバイダ|
|`<intent-filter>`|アクティビティ、サービス、ブロードキャストレシーバが起動するためのインテントの指定|
|`<action>`|intent-filterへ設定するアクション|
|`<category>`|intent-filterへ設定するカテゴリ|
|`<data>`|intent-filterへ設定するデータ|
|`<users-permission>`|セキュリティがかけられた部品へアクセスするために指定｜
|`<permission>`|自身のアプリケーションにかけるセキュリティ定義|
|`<instrumentation>`|テスト時に利用するクラスやテストの対象を設定|
|`<uses-sdk>`|アプリケーションが動作するAPIレベルを指定|
|`<uses-configuration>`|アプリケーションで必要とするハードウェアなど|
|`<uses-feature>`|アプリケーションが利用するハードウェアなど|
|`<uses-library>`|アプリケーションが利用するライブラリ|

#### `<manifest>`タグ

AndroidManifest.xmlのルートタグ

タグの属性

|||
|---|---|
|xml:android|Androidの名前空間の設定|
|package|Javaのパッケージ名を指定、他のアプリと重複しない名前にする必要がある|
|android:versionCode|内部で扱われるバージョン番号|
|android:versionName|ユーザに表示されるバージョン名|
|android:installLocation|アプリケーションの初期インストール場所|
|android:sharedUserId|他のアプリと連携する際に用いる共有ユーザID|
|android:shardUserLabel|共有ユーザIDに対するラベル|

##### アプリケーションのインストール場所

APIレベル8で追加された、android:installLocation属性で指定できる

|internalOnly|内部ストレージにのみインストール|
|auto|基本内部だが、容量不足の場合は外部ストレージ|
|preferExternal|外部ストレージが基本で、できない場合は内部ストレージ|

#### `<application>`タグ

アプリケーション全体の構成を記述する

|||
|---|---|
|android:icon|アイコンの設定|
|android:label|アプリケーション名|
|android:process|プロセス名を明示的に指定する場合|
|android:theme|テーマ|
|android:debuggable|アプリケーションのデバック可否|
|android:description|アプリケーションの説明文|

#### アイコンとアプリケーション名の設定の仕方

```XML
     <application
         android:icon="@drawable/ic_launcher"
         android:label="@string/app_name" >
```

@drawableはres/drawableに格納されているic_launcherファイル
@stringはres/valuesフォルダに格納されているファイルたちの中で定義されているapp_name

##### アプリケーションランチャーに表示されるアイコンと文字列

`<application>`タグによって指定されたアイコンとラベルはアプリケーションのデフォルト値として利用される。

## XMLの書式

### Androidで利用される主なリソースタイプ

Androidで利用されるリソースの種類

|||
|---|---|
|アニメーション|ビューに対するアニメーションの設定|res/anim|
|状態に応じた色|ビューの状態毎に適用される独自の色設定|res/color|
|画像|アプリケーションで利用する画像|res/drawable|
|レイアウト|アプリで利用する画面レイアウト|res/layout|
|メニュー|アプリケーションで利用するメニュー|res/menu|
|文字列|アプリケーションで利用する文字列|res/values|
|スタイル|画面レイアウトで利用する共通的な設定|res/values|
|その他の値|色、整数、サイズといった定数の定義|res/values|
|任意のXML|上記以外の設定ファイルなど|res/xml|
|その他|任意のファイル|res/raw|

#### 文字列リソース

静的な文字手列を定義する場合に使用するリソース
res/valuesフォルダに任意のファイル名で作成する。
ルートタグは`<resouces>`タグ、子タグとして`<string>`タグを利用して定義する。

#### 文字列リソース（配列）

複数文字列を配列のように定義することが出来る。
`<string-array>`タグを利用し、各項目を`<item>`タグで記述する

#### 文字列リソース（複数形）

文字列の対象物が、単一と複数とで呼び方が異なるものがある。
その時に、各数に応じて表示文字列を変化させる仕組みがある。
`<plurals>`タグを利用する。子タグとして`<item>`タグで記述し、quantity属性でそれぞれどの数の場合かを記述する
ResourcesクラスのgetQuantityStringメソッドにリソースIDと数値を指定することで該当する文字列を取得できる

##### リソース参照の仕方

XMLでは@{type}/{name}
JavaコードではR.{type}.{name}

#### レイアウトリソース

静的に画面レイアウトを定義するためのリソース。
res/layoutフォルダへ任意のファイル名で作成。
タグにはViewクラスあるいはViewクラスのサブクラスを指定する
android:layout_widthとandroid:layout_heightは必ず指定する必要がある

#### スタイルリソース

画面で利用する共通的な設定を定義できる
res/valuesフォルダに作成する
タグは`<resources>`タグで記述し、子タグに`<style>`タグを記述して設定する
`<style>`タグの子タグは`<item>`タグ

#### アニメーションリソース

ButtonやTextViewなどのビューにアニメーションを定義するためのファイル。
res/animフォルダに作成する。

#### メニューリソース

各種メニューを定義するファイル。
res/menuフォルダに作成する

#### 整数リソース

静的に整数を定義するリソース
res/valuesフォルダに作成する
`<resources>`タグを利用し、`<integer>`タグを使って設定する。

#### 整数リソース（配列）

文字列と同様に`<integer-array>`タグを利用することで配列リストを作成できる

#### Android標準で提供されるリソース

標準で様々なリソースが提供されている。利用する場合は
XMLの場合@android:{type}/{name}、Javaの場合はandroid.R.{type}.{name}で指定する。

## リソースの代替設定と国際化

### リソースの代替え設定

デバイスの構成や設定に応じて最適なリソースを使用する設定。

|||
|---|---|
|画面サイズ|デバイスの対角線上の長さ（inch）|
|ピクセル密度|1インチ当たりのドットの数(dpi)|
|アスペクト比|画面のアスペクト比|
|デバイスの向き|ユーザが表示している向き（縦、横）|
|APIレベル|デバイスがサポートしているAPIレベル|

代替え設定するには、res配下のフォルダ名に「-」で修飾する

#### 画面サイズによる代替設定

small, normal, large, xlargeそれぞれのリソースを定義することで可能となる

#### ピクセル密度による代替設定

ldpi(12dpi), mdpi(160dpi), hdpi(240dpi), xhdpi(320dpi)で定義する。

#### アスペクト比による代替設定

long, notlongで定義する。longはWQVGA, WVGAの時に適用される

#### デバイスの向きによる代替設定

port(縦向き), land(横向き)で定義する

#### APIレベルによる代替設定

APIレベルによる代替も可能。APIレベル番号の前にvを付加してフォルダを作成する。

### 代替え設定を複数利用

代替設定は複数設定可能。
ただし、複数する場合は設定する順番が指定されている

(http://developer.android.com/intl/ja/guide/topics/resources/providing-resources.html#QualiferRules)

### リソースの国際化

異なる言語における表示をサポートするための機能が用意されている。
代替設定と同様に-と各言語コードで定義する

ISO639-1で定義されている

|||
|---|---|
|日本語|ja|
|英語|en|
|中国語|zh|
|スペイン語|es|
|フランス語|fr|
|韓国語|ko|

#### 地域ごとのリソースの切り替え

同一の言語を利用していても地域ごとに表現が異なる場合も対応可能
地域コードを付与することで切り替えられる
ISO3166-1-alpha2で定義されており、頭にrをつけることで定義できる

|||
|---|---|
|日本|JP|
|アメリカ合衆国|US|
|イギリス|GB|
|スペイン|ES|
|メキシコ|MX|
|フランス|FR|
|カナダ|CA|

英語（イギリス）の場合 values-en-rGB/strings.xml
英語（アメリカ）の場合 values-en-rUS/strings.xml

## セキュリティとパーミッション

### Androidで制限される主な機能

以下のような機能はデフォルトで禁止されている

- ユーザ情報の取得
- ユーザが管理している連絡先情報の取得
- デバイスが起動したことを検知する
- カメラの利用
- GPSを利用した位置情報の取得
- インターネット接続
- SDカードなどの外部記憶装置へのアクセス

### 制限されている機能の利用方法

ユーザーに許可を求めることで利用できる。
そのためにはAndroidManifest.xmlファイルに記述する。
`<manifest>`タグの子タグとして`<uses-permission>`タグで記述する

|||
|---|---|
|ユーザ情報の取得|android.permission.GET_ACCOUNTS|
|ユーザが管理している連絡先情報の取得|android.permission.READ_CONTACTS|
|デバイスが起動したことを検知する|android.permission.RECEIVE_BOOT_COMPLETED|
|カメラの利用|android.permission.CAMERA|
|GPSを利用した位置情報の取得|android.permission.ACCESS_FINE_LOCATION|
|インターネット接続|android.permission.INTERNET|
|SDカードなどの外部記憶装置へのアクセス|android.permission.WRITE_EXTERNAL_STORAGE|

### 制限された機能についてのユーザへの確認

マニフェストで定義されたパーミッションはインストールするときにユーザーが許可している。