SATCHのシナリオをWebサーバーからダウンロードして使う2
「SATCHのトラッキング・シナリオをSDカードからロードして使う」では、
ダウンローダーが別アプリになっていて2度手間でした。
また、「SATCHのシナリオをWebサーバーからダウンロードして使う」では、
シナリオのベース作成にLiteを使っていたので、ZIP展開時の階層構造が深くて、再作成時に面倒でしたし、ダウンロードをLuaでやっていたので、Java側のコードが複雑になっていました。
また、ダウンロードとシナリオ・ロード時にメニュを2度タップする手間もかかっていました。
今回は、Java側でダウンロードとシナリオ・ロードを同時にやってみました。これで「2度手間」の問題が解消しましたです(^^)。
リンク
SATCHのシナリオをWebサーバーからダウンロードして使う
フェルメールの作品のトラッキングデータをダウンロード
SATCHのトラッキング・シナリオをSDカードからロードして使う
TOP
方法
SATCH側でシナリオを作る場合の注意点ですが、
●シナリオは階層構造を持たないようにすること。
キャリブレーション用のxmlも、トラキング用のファイルも表示用のオブジェクトデータ
もすべて同じ層にあるようにします。
これは、Java側でZIPを展開する際に使っている関数が階層構造を認識できないため
の措置です。
もう少し気の利いた関数を見つければ不要なのですが...。
●すべてのシナリオで同じアプリケーションIDを使う。
こんな感じ。
com.kddi.satch.xxxx
●dpdファイル名を同じにしておく。
シナリオの作成が完了すれば、これをZIPアーカイブして、Web上にアップロードしておきます。
SATCH側は以上です。
Java側について
ダウンロードの方法は、コチラを参照。
JavaのDownloadManagerを使ってファイルをダウンロード
SDカードのdownloadフォルダーにダウンロードするコードを使います。
で、BroadcastReceiverでダウンロードの完了を検知したら、ZIPを別フォルダー(例:Scenario)に展開・元のZIP削除・シナリオのロードを実行します。
すでにシナリオがあれば、ロードのみ実行します。
以下が必要となるコードのサンプルです。
Scenariフォルダーチェック(無ければ作成)
if (folder_exist("Scenario") == false) { String scenario_path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + "Scenario"; File scenario_dir = new File(scenario_path); //folder作成 scenario_dir.mkdir(); }
ZIPの展開と元ZIPの削除
String download_path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/download/" + <ZIPファイル名>; String distination_path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Scenario/" + <ZIPにする前のフォルダー名>; public void extract(String filename,String folderpath) { File distparent_dir = new File(folderpath); distparent_dir.mkdir(); ZipInputStream in = null; BufferedOutputStream out = null; ZipEntry zipEntry = null; int len = 0; String extension = ""; String f_name = ""; try { in = new ZipInputStream(new FileInputStream(filename)); // ZIPファイルに含まれるエントリに対して順にアクセス while ((zipEntry = in.getNextEntry()) != null) { File newfile = new File(zipEntry.getName()); // 出力用ファイルストリームの生成 f_name = newfile.getName(); out = new BufferedOutputStream(new FileOutputStream(folderpath + "/" + newfile.getName())); // エントリの内容を出力 byte[] buffer = new byte[1024]; while ((len = in.read(buffer)) != -1) { out.write(buffer, 0, len); } in.closeEntry(); out.close(); out = null; } // File download_file = new File(filename); download_file.delete(); // loadScenario_II(); } catch (IOException e) { e.printStackTrace(); } }
シナリオの存在チェック
引数は、シナリオ名。
private boolean scenario_exist(String s_name){ //----------------------------------------------- //ファイルの一覧を検索するディレクトリパスを指定する String download_path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + "Scenario"; File scenario_dir = new File(download_path); String tempname = ""; //ファイル名のリストを作成 final File[] files = scenario_dir.listFiles(); for (int i = 0; i < files.length; i++) { File file = files[i]; tempname = file.getName(); if (s_name.equals(tempname)){ return true; } } return false; }
シナリオのロード
public void loadScenario_II(){ String SDFile = android.os.Environment.getExternalStorageDirectory().getPath(); String dpdfile = SDFile + "/Scenario/<シナリオ名>/<dpdファイル名>"; Log.w("FILENAME",dpdfile); _kddiComponent.loadScenario(dpdfile); }
TOP
サンプル1
サンプルとして、トラッキング画像を検出したら、アップルの昔のマシンを表示するものを作ってみました。
これは、同じトラッキング画像で、異なるオブジェクトを表示します。
素材は3つ。
Apple Lisa
Macintosh XL
Macintosh Classic II
トラッキング用の画像です。
認識したら、こんな感じ。
初期画面です(真っ黒です)。
メニュキーをクリックしてメニュを出します。
シナリオが無い場合、ダウンロードが開始されます。
あれば、ロードされます。
ダウンロードが終了すると、シナリオのZIPが展開され、その後ロードが実行されます。
トラッキングするとこんな感じ。
インストール
アプリをQRコードからインストールする方法はコチラを参照
TOP
サンプル2
サンプルとして、トラッキング画像を検出したら、ロゴを表示します。
今回は、異なるトラッキング画像で、異なるオブジェクトを表示します。
こんな感じ。
トラッキング用の画像。
(サモトラケのニケ、ナイキの社名の由来)
インストール
アプリをQRコードからインストールする方法はコチラを参照
TOP
トップページ| サイトマップ|