データの読み・書きに関してのメモ

閲覧: 212 回
最初の未読メッセージにスキップ

吉岡 梅

未読、
2010/07/18 5:30:262010/07/18
To: AIR/Flash for Android
吉岡です。アプリ作成時のデータの読み・書きに関してのメモです。
何回やっても忘れてしまうのでまとめてみました。

基本線は、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

吉岡 梅

未読、
2010/07/20 2:30:432010/07/20
To: AIR/Flash for Android
吉岡です。

ファイルの読み込みで、大事なものを一つ忘れていました!

-カメラロール画像から、専用の画像選択用アクティビティを使用して選択した画像を読み込み
カメラロール(ギャラリー)内の画像は、CameraRoll.browseForImage()メソッドを
実行することで、専用の画像選択用アクティビティ表示し、選択できます(Androidの標準の例のあれです)。

選択した画像には、MediaPtomiseを使用してアクセスし、利用する事が可能です。


//CameraRollを準備し、画像選択時に発生するMediaEvent.SELECTイベントに関数割り当て
var cr:CameraRoll = new CameraRoll();
cr.addEventListener(MediaEvent.SELECT,onSelectImage);
//画像選択アクティビティを表示
cr.browseForImage();

//画像選択時の処理
function onSelectImage(e:MediaEvent):void{
//選択した画像に関する情報(MediaPromise)は、イベントオブジェクトのdataプロパティに格納されている
var mp:MediaPromise = e.data;

//MediaPromiseはそのまんまLoaderで読み込んで表示する事も可能
var loader:Loader = new Loader();
loader.loadFilePromise(mp);
addChild(loader);
}


やっぱりカメラで撮った写真を何かしら加工したり公開したりするのは楽しいですもんね。
全員に返信
投稿者に返信
転送
新着メール 0 件