吉岡です。アプリ作成時のデータの読み・書きに関してのメモです。
何回やっても忘れてしまうのでまとめてみました。
基本線は、Fileで任意のファイルにアクセスします。
さらに、直接扱いたい場合には、FileStreamで読み書きします。
この再、Fileの定数の利用や、パスの書き方によって、いろいろな場所へと
アクセス可能です。
また、カメラロールに画像を書き出したい場合にはお手軽なCameraRollが、
apkに同梱した画像を読み込みたい場合には、Flashムービーではおなじみの
Loader&URLRequestが利用できます。
以下、コードです。例によってimportやエラー処理は飛ばしています。
■書き出しまとめ
-画像をカメラロールへと書き出す
BitmapDataをCameraRoll.addBitmapDataで書き出し
var bmd:BitmapData = new BitmapData(640,480);
bmd.draw(this); //なんやらかんやら画像書き込み
var cr:CameraRoll = new CameraRoll();
cr.addBitmapData(bmd);
-アプリ専用ストレージへ書き出す(いわゆるアプリ専用ローカルデータ)
Fileを使って「app-strage:/」へアクセスし、FileStreamでバイナリストリーム(ByteArray)を書き出し
//BitmapData「bmd」をJPEGエンコードし、「hoge.jpeg」という名前でローカルに保存する場合
//画像データ作成
var data:ByteArray = new JPEGEncoder().encode(bmd);
//「hoge.jpeg」という名前で書き込み
var f:File = new File("app-storage:/hoge.jpeg");
var s:FileStream = new FileStream();
s.open(f,FileMode.WRITE);
s.writeBytes(data);
-SDカードへ書き出す
File.documentsDirectoryの値を利用してSDカードへアクセス。あとは同じ
var data:ByteArray = new JPEGEncoder().encode(bmd);
//SDカードのルートに、「fromAIR.jpeg」という名前で書き出し
var f:File = File.documentsDirectory;
f = f.resolvePath("fromAIR.jpeg")
var s:FileStream = new FileStream();
s.open(f,FileMode.WRITE);
s.writeBytes(data);
※設定ファイルに
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
の設定が必要です
--
■読み込みまとめ
-apkに同梱した画像やSWFをLoaderに読み込む
Loader&URLRequestで同梱した画像ファイル等を読み込む場合には、
はそのまま相対パスでアクセス可能。
//apkに「piyo.png」という画像ファイルを同梱した場合
var req:URLRequest = new URLRequest("piyo.png");
var loader:Loader = new Loader();
loader.load(req);
addChild(loader);
-apkに同梱したファイルを読み込む
「app:/」等からFileでアクセスし、FileStreamで読み込み。
持ち込んだDBファイル等もこの方法でアクセスできます。
//apkに「piyo.png」という画像ファイルを同梱した場合
var f:File = new File("app:/piyo.png");
//ファルを開き、バイト配列へと内容を取得
var s:FileStream = new FileStream();
s.open(f,FileMode.READ);
var data:ByteArray = new ByteArray();
s.readBytes(data);
//取得した値を利用。今回は画像をLoaderに表示。
var loader:Loader = new Loader()
loader.loadBytes(data);
addChild(loader);
-アプリ専用ストレージからファイルを読み込む
「app-storage:/」等からFileでアクセスし、FileStreamで読み込み。
//アプリ専用ストレージの「piyo.png」という画像ファイルにアクセスしたい場合
var f:File = new File("app-storage:/piyo.png");
//以下、apk同梱ファイルと同じ
-SDカードからファイルを読み込む
File.documentsDirectoryの値を利用してSDカードへアクセス。あとは同じ。
//SDカード直下の「piyo.png」という画像ファイルにアクセスしたい場合
var f:File = File.documentsDirectory;
f = f.resolvePath("piyo.png");
//以下、apk同梱ファイルと同じ
-FileReferenceを使用してユーザーに読み込むファイルを選択してもらい、読み込む
FileReference.browseメソッド使って選択用アクティビティを表示し、選択結果をFileStreamで読み込み。
(FileはFileReferenceを継承しているので、そのままbrowseメソッドが使用できます)
//ユーザーに選択してもらったSDカード内の画像ファイルを表示
var f:File =File.documentsDirectory;
//選択完了時に発生するselectイベントにリスナー登録
f.addEventListener(Event.SELECT,selectFunc;
//browseで選択UI表示
var imagesFilter:FileFilter = new FileFilter("Images",
"*.jpg;*.gif;*.png");)
f.browse([imagesFilter]);
//選択完了時に実行する処理
function selectFunc(e:Event){
var f:File = e.target as File;
var s:FileStream = new FileStream();
s.open(f,FileMode.READ);
var data:ByteArray = new ByteArray();
s.readBytes(data);
var l:Loader = new Loader()
l.loadBytes(data);
addChild(l);
}
※現状、FileReference.browseでは、SDカード内の画像、音源ファイルにしか
アクセスできません。他のフォルダを指定してもSDカードのディレクトリが開きます。
また、選択用アクティビティ表示時には、一時的にコンテンツが隠れますので、
NativeApplicationのdeactivateイベントが発生します。
そのため、deactivateイベント内でexitしていると、そのままアプリが終了しますのでご注意を。
--
■Fileクラスの定数と対象ディレクトリ
File.applicationDirectory:同梱(assets)ファイルのルート
File.applicationStorageDirectory :アプリ専用ストレージ
File.desktopDirectory :SDカード
File.documentsDirectory:SDカード
File.createTempDirectory() :/data/data/app.appId/cache
File.createTempFile() :/data/data/app.appId/cache
app:/ :同梱(assets)ファイルのルート
app-storage:/:アプリ専用ストレージ
ながくなってしまいましたが、ご勘弁を。
ではでは。
---
シルエロ:吉岡梅
umeyo...@gmail.com