Android携帯ゲームを作って世界に配信してみよう(5) ―― インターネットからデータをダウンロードするアプリを開発する
2.AndroidアプリからHTTP通信する方法
AndroidアプリからのHTTP通信には,特に難しいところはありません.Javaに標準的に用意されているAPIを利用して簡単に実装できます.Java標準の機能のみを利用するので,サーバ・サイドJava(サーバ側のJava実行環境)で同様の処理の経験がある方には,難しいことは何もないでしょう.
●一つのクラス・ファイルを新規に追加
サンプル・アプリの一つ前のバージョン(第3回)と今回のものの差分を簡単に説明すると,表1のようになります.今回追加した機能を処理するクラス・ファイル(BackgroundImage.java)を一つ新規に追加しました.それ以外にも,そのクラスを呼び出すために,ほかのクラスの一部を修正しています.
表1 今回と前バージョンのサンプル・アプリの差分
ファイル名 (クラス概要) | ステータス | 変更内容詳細 |
BackgroundImage.java (背景画像管理クラス) | 新規 | 新規に追加された下記の機能を実装 「アプリの起動時に,背景画像をインターネットからダウンロードし,内部ストレージに保存する.次回以降の起動時には内部ストレージから読み込む」 |
PlayScene.java (ゲームプレイ画面 管理クラス) | 修正 | 描画時に背景画像を表示するように修正 |
Main.java (ゲーム全体の管理クラス) | 修正 | 起動時にBackgroundImageクラスのinitメソッドを呼び出すように修正 |
●起動時の処理の流れ
まず,ゲーム全体の流れを管理するMainクラスが,アプリが起動する際に,BackgroundImageクラスのinitメソッドを呼び出します.このinitメソッドから,インターネットから画像を取得してローカル・ストレージに格納する機能(今回の肝の機能)を処理するloadImageメソッドを呼び出しています(リスト1).loadImageは,画像が既に読み込まれている場合は何もしませんが,それ以外の場合はインターネットから背景画像を取得します.取得した画像は内部ストレージに保存され,次回以降はこの保存された画像を利用します.
リスト1 BackgroundImageクラスのloadImageメソッド(BackgroundImage.javaより抜粋)
/** 画像をロードする. */ private static void loadImage() { // 既に,現在の時間帯にあった画像が読み込まれている場合は // 画像を読み込まない final int hourly = hourly(); if (image != null && hourly == BackgroundImage.hourly) { return; } // 画像が読み込まれているが時間帯が異なるので破棄 if (image != null) { image.recycle(); image = null; System.gc(); } byte[] data = load(fileNameOfBkgnd(hourly)); // (1) if (data != null) { // (2) Log.i("Dribble","BackgroundImage is loaded from the file."); } else { data = httpGetBinary(URL_IMAGE[hourly]); // (3) if (data != null) { // (4) Log.i("Dribble","BackgroundImage is got from the internet."); save(fileNameOfBkgnd(hourly),data); } else { Log.i("Dribble","BackgroundImage can't be got from the internet."); } } // (5) image = BitmapFactory.decodeByteArray(data, 0, data.length); } |
まず,リスト1(1)にて,内部ストレージから画像を読み込みます.処理は,loadメソッドに記述されています(内部ストレージへのデータの書き込みと読み込みについては,第3回の解説を参照のこと).このメソッドは,処理に成功すると,読み込んだ結果をバイナリ配列に格納して返します.(ファイルが存在しないなどの原因で)読み込みに失敗した場合は,「null」を返します.
もし,「null」が返された(ファイルの読み込みに失敗した)場合は,インターネットから画像をまだダウンロードしていないと判断します〔リスト1(2)〕.その場合は,配列URL_IMAGEで定義済みの画像ファイルのURLを指定し,ファイルをダウンロードするメソッド「httpGetBinary」を呼び出して,取得したデータをバイト配列形式で受け取ります〔リスト1(3)〕.このhttpGetBinaryメソッドが,今回のインターネット通信の肝の部分となるので,この次に詳しく説明します.
ファイルの読み込みに成功したら,そのバイナリ・データを引き数に指定して,Android APIで用意されているBitmapFactoryクラスのdecodeByteArrayメソッドを呼び出します.decodeByteArrayメソッドからは,画像の内部形式であるBitmapオブジェクトが返されます〔リスト(4)〕.