Android携帯ゲームを作って世界に配信してみよう(3) ―― 効果音の入れ方とデータの保存処理を学ぶ
4.データを読み込み・保存しよう!
今回のゲームでは,ハイスコアを達成したときはそのスコアと日時を保存し,アプリを再起動した場合に,以前保存したスコアと日時をファイルから読み込み,タイトル画面に表示させています.
ハイスコアの読み込み・保存を実装するには,「内部ストレージ」という機能を利用します.Androidでは内部ストレージ以外にも,外部ストレージ,キーバリュー管理,簡易データベースなどのデータ管理機能が用意されています.詳しくは,下記のGoogle社の資料を参照してください.
Data Strage | Android Developers
http://developer.android.com/intl/ja/guide/topics/data/data-storage.html
では,まず内部ストレージに存在するデータ・ファイルを読み込む方法を説明します.
(1)ファイル読み込み管理クラスの生成 FileInputStream fis = context.openFileInput(fileName);
(2)データの読み込みとバッファへの格納 fis.read(buffer,offset,length);
(3)読み込み終了 fis.close();
(1)で,ファイル読み込み管理クラスFileInputStreamを生成して,指定したファイル名(fileName)のファイルの読み込みを開始します.続いて(2)で,指定した長さ(length)のデータを読み込み,指定したバッファ(buffer)の指定した開始位置(offset)に格納します.なお,バッファはあらかじめ,offset+length以上の長さのバイト型の配列を確保してください.そして,すべての読み込みが完了したら,(3)のように終了処理を行います.
次に,新規にファイルを生成して,データを書き込む流れをご紹介します.
(1)ファイル書き込み管理クラスの生成 FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE);
(2)データの書き込み fos.write(buffer,start,length);
(3)書き込み終了 fos.close();
(1)で,データを書き込むファイル名(fileName)とファイルのアクセス権限(例では,Context.MODE_PRIVATE)を指定して,ファイル書き込み管理クラスFileOutputStreamを生成します.もしファイルが存在していない場合は,ここでファイルを新規に生成します.(2)では,指定したバッファ(buffer)の指定した開始位置(start)から,指定した長さ(kength)のデータをファイルに書き込みます.すべての書き込みが終わったら,忘れずに,(3)のように終了処理を行います.
さらに,ファイルの読み書きで一番重要なContextクラスのopenFileInputメソッドと,openFileOutputメソッドについて詳しく説明します.なお,FileInputStreamクラスとFileOutputStreamクラスはJava標準のクラスなので,ここでは説明を省略します.詳しくはJavaのAPIドキュメント(http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/)を参照してください.
●ファイルを読み込む:ContextクラスのopenFileInputメソッド
public FileInputStream openFileInput (String name)
このメソッドは,アプリケーション・パッケージに関連付けられたプライベートなファイルを読み込みのために開きます.ファイルが存在しない場合はFileNotFoundException例外が発生します.引き数と戻り値は表6のようになります.
表6 Contextクラス openFileInputメソッドの引き数と戻り値
引き数 name | ファイル名を指定する.パスやセパレータを含まずに,ファイル名(と拡張子)だけを指定すること |
戻り値 | ファイルを読み込み用に開くことが成功した場合は,指定したファイルの読み込みを管理するFileInputStreamクラスのインスタンスが返される |
読み込まれるファイルは,Androidのファイル管理システム上の"/data/data/<アプリケーションのパッケージ名>/<指定したファイル名>"に存在するファイルです.今回のアプリでハイスコアを保存するファイル名は「playlog.dat」ですが,この場合は,/data/data/com.spicysoft.sample.dribble/playlog.datになります,
●ファイルに書き込む:ContextクラスのopenFileInputメソッド
public abstract FileOutputStream openFileOutput (String name, int mode)
このメソッドは,アプリケーション・パッケージに関連付けられたプライベートなファイルを書き込みのために開きます.もしファイルが存在していない場合は,自動でファイルが生成されます.引き数と戻り値は表7のようになります.
表7 Contextクラス openFileInputメソッドの引き数と戻り値
name | データを書き込みたいファイル名を指定する |
mode | 作成したファイルのアクセス権限を指定する.アクセス権限を指定するフラグは以下の4種類である. Context.MODE_PRIVATE(デフォルト値):ファイルを生成したアプリケーションのみがアクセスできるプライベート・ファイルを生成する |
戻り値 | ファイルを書き込み用に開くことが成功した場合は,指定したファイルの書き込みを管理するFileOutputStream クラスのインスタンスが返される |
なお,アクセス権限を指定するフラグは,複数組み合わせることができます.例えば,MODE_APPENDは,MODE_PRIVATE | MODE_APPENDのように使うと,プライベート・ファイルを追記モードで生成します.また,他のアプリでも読み書き可能なファイルを生成する場合は,MODE_WORLD_READABLE | MODE_WORLD_WRITEABLEと指定します.