Android携帯ゲームを作って世界に配信してみよう(5) ―― インターネットからデータをダウンロードするアプリを開発する

山田 元康

tag: 組み込み

エレキ系DIY 2012年5月10日

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)〕.

 

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日