svnno****@sourc*****
svnno****@sourc*****
2012年 7月 15日 (日) 00:44:25 JST
Revision: 158
http://sourceforge.jp/projects/smartupload/scm/svn/commits/158
Author: youthfulday23
Date: 2012-07-15 00:44:25 +0900 (Sun, 15 Jul 2012)
Log Message:
-----------
Y.Narisawa
dummy code upload(now writing)
Added Paths:
-----------
trunk/src/Android/SmartUpLoad_main/src/smartUpLoad/or/jp/SmartUpLoad_BaseActivity.java
trunk/src/Android/SmartUpLoad_main/src/smartUpLoad/or/jp/SmartUpLoad_Cancelable.java
trunk/src/Android/SmartUpLoad_main/src/smartUpLoad/or/jp/SmartUpLoad_CancellingTask.java
trunk/src/Android/SmartUpLoad_main/src/smartUpLoad/or/jp/SmartUpLoad_HttpManager.java
trunk/src/Android/SmartUpLoad_main/src/smartUpLoad/or/jp/extendLog.java
-------------- next part --------------
Added: trunk/src/Android/SmartUpLoad_main/src/smartUpLoad/or/jp/SmartUpLoad_BaseActivity.java
===================================================================
--- trunk/src/Android/SmartUpLoad_main/src/smartUpLoad/or/jp/SmartUpLoad_BaseActivity.java (rev 0)
+++ trunk/src/Android/SmartUpLoad_main/src/smartUpLoad/or/jp/SmartUpLoad_BaseActivity.java 2012-07-14 15:44:25 UTC (rev 158)
@@ -0,0 +1,219 @@
+package smartUpLoad.or.jp;
+
+
+import java.util.UUID;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+
+import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.ServiceConnection;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.Parcel;
+import android.os.RemoteException;
+import android.widget.Toast;
+
+/**
+ * 全Activityのベースとなるクラス
+ * @author hterashima
+ *
+ */
+public abstract class SmartUpLoad_BaseActivity extends Activity{
+
+ /* =============== メンバ変数 開始 =============== */
+// static final int BUFFER_SIZE = 663; // バッファサイズ確認
+// static final String MY_SERVICE = "SmartMeter"; // サービス名
+// static final UUID SERIAL_PORT_PROFILE = UUID // UUID
+// .fromString("00001101-0000-1000-8000-00805f9b34fb");
+// protected final static int MSG_ID_SPP_RECEIVE = 0; // メッセージID受信
+// protected final static int MSG_ID_SPP_SEND = 1; // メッセージID送信
+// Handler mHandler = null; // ハンドラ
+// SmtMtrApplication mApplication; // アプリケーションクラス
+// SmtMtrCancelable mCancellable; //
+// static AtomicBoolean mClosed = new AtomicBoolean(); // BT接続フラグ
+
+ protected ComponentName mRemoteControlResponder;
+ protected IBinder mBinder = null;
+ /* =============== メンバ変数 終了 =============== */
+
+ protected ServiceConnection mConnection = new ServiceConnection() {
+
+ public void onServiceDisconnected(ComponentName name) {
+ mBinder = null;
+ onServiceStateChange(false);
+ extendLog.Log_D("service disconected");
+ }
+
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ extendLog.Log_D("service conected");
+ mBinder = service;
+ onServiceStateChange(true);
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ extendLog.Log_D();
+
+ // アプリケーションクラスの取得
+// mApplication = (SmtMtrApplication)getApplication();
+ // 初期化
+ onSubCreate();
+ init();
+
+ extendLog.Log_D();
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ extendLog.Log_D();
+ // HandlerをApplicationクラスに登録
+ // nullでない場合のみ
+ // クラス名で判別する
+ // クラス名はリストで保持されている
+// if(mHandler != null) {
+// mApplication.registerHandler(this.getClass().getName(), mHandler);
+// }
+
+ onSubStart();
+ extendLog.Log_D();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ extendLog.Log_D();
+ onSubResume();
+ extendLog.Log_D();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ extendLog.Log_D();
+ onSubPause();
+ extendLog.Log_D();
+ }
+
+ // 2012.1.20 H.Terashima ADD S
+ @Override
+ protected void onStop() {
+ super.onStop();
+ extendLog.Log_D();
+ onSubStop();
+ extendLog.Log_D();
+ }
+ // 2012.1.20 H.Terashima ADD E
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ extendLog.Log_D();
+ onSubDestroy();
+ extendLog.Log_D();
+ }
+
+ abstract void init();
+ abstract void onSubCreate();
+ abstract void onSubStart();
+ abstract void onSubResume();
+ abstract void onSubPause();
+ abstract void onSubStop();
+ abstract void onSubDestroy();
+ abstract void onServiceStateChange(boolean state);
+
+ /**
+ * メインスレッドにメッセージを送信
+ * @param msg
+ */
+ void sendMessage(Message msg) {
+ extendLog.Log_D();
+ // データ共有クラスからHandlerを取得
+ extendLog.Log_D(this, "send from : " + this.getClass().getName());
+// Handler tempHandler = mApplication.getHandler(this.getClass().getName());
+// if(tempHandler != null) {
+// // メインスレッドにメッセージ送信
+// tempHandler.sendMessage(msg);
+// }
+// else {
+// extendLog.Log_D(this, "Handler is null");
+// }
+ extendLog.Log_D();
+ }
+
+ /**
+ * 指定した文字列をトーストで出力する
+ * @param msg 出力するメッセージ
+ */
+ void dumpMessage(final String msg) {
+ extendLog.Log_D();
+ final Context context = this;
+ Runnable dumpTask = new Runnable() {
+ public void run() {
+ Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
+ }
+ };
+ runOnUiThread(dumpTask);
+ extendLog.Log_D();
+ }
+
+// /**
+// * タスクを実行する
+// * @param exec ExecutorService
+// * @param task Cancelable
+// * @param timeOut タイムアウト時間
+// * @param unit TimeUnit
+// */
+// void executeTask(ExecutorService exec, SmtMtrCancelable task, int timeOut, TimeUnit unit) {
+// extendLog.Log_D();
+// SmtMtrCancelable canceller = new SmtMtrCancellingTask(exec, task);
+// exec.execute(canceller);
+// extendLog.Log_D();
+// }
+
+ /**
+ * サービスに処理を行わせる行わせる
+ * @param transactCode サービスが行う処理ID
+ * @param data サービスに渡すデータ
+ * @return 処理結果(Parcelの中身は処理によって異なる)
+ */
+// protected Parcel transact(int transactCode, Parcel data) {
+// extendLog.Log_D();
+// Parcel reply = Parcel.obtain();
+// try {
+// mBinder.transact(transactCode, data, reply, 0);
+// } catch (RemoteException e) {
+// SmtMtrLog.SmtMtrLog_E("RemoteException :" + e);
+// e.printStackTrace();
+// }
+// extendLog.Log_D();
+// return reply;
+// }
+
+ /**
+ * サービスに処理を行わせる行わせる
+ * @param transactCode サービスが行う処理ID
+ * @param data サービスに渡すデータ
+ * @param reply 戻り値を格納するデータ
+ * @return 処理結果(Parcelの中身は処理によって異なる)
+ */
+ protected void transact(int transactCode, Parcel data, Parcel reply) {
+ extendLog.Log_D();
+ try {
+ mBinder.transact(transactCode, data, reply, 0);
+ } catch (RemoteException e) {
+ extendLog.Log_E("RemoteException :" + e);
+ e.printStackTrace();
+ }
+ extendLog.Log_D();
+ }
+
+}
Added: trunk/src/Android/SmartUpLoad_main/src/smartUpLoad/or/jp/SmartUpLoad_Cancelable.java
===================================================================
--- trunk/src/Android/SmartUpLoad_main/src/smartUpLoad/or/jp/SmartUpLoad_Cancelable.java (rev 0)
+++ trunk/src/Android/SmartUpLoad_main/src/smartUpLoad/or/jp/SmartUpLoad_Cancelable.java 2012-07-14 15:44:25 UTC (rev 158)
@@ -0,0 +1,11 @@
+package smartUpLoad.or.jp;
+
+/**
+ * Runnableを継承した薄いラッピングクラス
+ *
+ * @author GT)Y.Narisawa
+ *
+ */
+public interface SmartUpLoad_Cancelable extends Runnable {
+ void cancel();
+}
\ No newline at end of file
Added: trunk/src/Android/SmartUpLoad_main/src/smartUpLoad/or/jp/SmartUpLoad_CancellingTask.java
===================================================================
--- trunk/src/Android/SmartUpLoad_main/src/smartUpLoad/or/jp/SmartUpLoad_CancellingTask.java (rev 0)
+++ trunk/src/Android/SmartUpLoad_main/src/smartUpLoad/or/jp/SmartUpLoad_CancellingTask.java 2012-07-14 15:44:25 UTC (rev 158)
@@ -0,0 +1,112 @@
+package smartUpLoad.or.jp;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import android.util.Log;
+
+/**
+ * 非同期処理のRunnableをラッピングしたクラス SmtMtrCancelableを引数にとり、自身をexcuterに渡し
+ * 自身のrunの中で引数で渡されたSmtMtrCancelableの継承先の非同期処理を行う。
+ * その際、ExecutorService.submit()を使用し、Futureクラスを受け取り
+ * タスクの戻り値をFuture.get()で取得できるようにしている。 しかし、実際にFuture.get()で返却される戻り値は取得しておらず、
+ * Future.get()でタイムアウトを検出できるようにするため、
+ * ExecutorService.excuteではなく、submit()を使用し、get経由でタイムアウトを 設定している。
+ *
+ * @author GT)Y.Narisawa
+ *
+ */
+public class SmartUpLoad_CancellingTask implements SmartUpLoad_Cancelable {
+
+ /* =============== メンバ変数 開始 =============== */
+ // TODO:メンバ変数の説明をDoxygen形式に修正する
+ private final ExecutorService mExec;
+ /*
+ * 自身のrunが呼ばれた際に、引数で渡されたSmtMtrCancelable クラスをsubmitしてrunさせるための変数
+ */
+ private final SmartUpLoad_Cancelable mTask;
+ /** 非同期処理させたいタスク(SmtMtrCancelableを継承したもののみ */
+ private final long mTimeout;
+ /** 上記非同期処理のタイムアウト時間 */
+ private final TimeUnit mUnit;
+ /** 上記非同期処理のタイムアウト時間の単位 */
+
+ /* =============== メンバ変数 終了 =============== */
+
+ /**
+ * デフォルトコンストラクタ メンバ変数に値を設定する(タイムアウトなしバージョン)
+ *
+ * @param exec
+ * @param task
+ */
+ public SmartUpLoad_CancellingTask(ExecutorService exec, SmartUpLoad_Cancelable task) {
+ this(exec, task, 0, null); // 下のコンストラクタをコール
+ }
+
+ /**
+ * デフォルトコンストラクタ メンバ変数に値を設定する(タイムアウトありバージョン)
+ *
+ * @param exec
+ * @param task
+ * @param timeout
+ * @param unit
+ */
+ public SmartUpLoad_CancellingTask(ExecutorService exec, SmartUpLoad_Cancelable task,
+ long timeout, TimeUnit unit) {
+ mExec = exec; // メンバ変数に保持
+ mTask = task; // メンバ変数に保持
+ mTimeout = timeout; // メンバ変数に保持
+ mUnit = unit; // メンバ変数に保持
+ }
+
+ /**
+ * タスクの取り消し処理 SmtMtrCancelableを継承したクラスのcancelメソッドをコールする
+ * このクラスでは抽象化するためSmtMtrCancelableクラスとして保持
+ */
+ public void cancel() {
+ mTask.cancel(); // 継承先のcancel処理をコール
+ }
+
+ /**
+ * タスクの実行関数 ここでSmtMtrCancelableを継承したクラスをsubmitして、非同期処理化させる
+ */
+ public void run() {
+ Future<?> future = null;
+ try {
+ future = mExec.submit(mTask);
+ waitForCompletionOrTimeout(future);
+ } catch (InterruptedException e) {
+ mTask.cancel();
+ extendLog.Log_E("InterruptedException :" + e);
+ extendLog.Log_E("interrupt task :" + mTask.getClass().getName());
+ } catch (ExecutionException e) {
+ extendLog.Log_E("task failed:"+ e);
+ mTask.cancel();
+ }
+ }
+
+ /**
+ * タイムアウトの有無を設定する submit時に引数として渡されるFutureを使用し、タイムアウトを設定する
+ * タイムアウト時間が設定されていない場合、タイムアウトは設定しない。
+ *
+ * @param future
+ * @throws InterruptedException
+ * @throws ExecutionException
+ */
+ private void waitForCompletionOrTimeout(Future<?> future)
+ throws InterruptedException, ExecutionException {
+ if (mTimeout <= 0) {
+ future.get();
+ return;
+ }
+ try {
+ future.get(mTimeout, mUnit);
+ } catch (TimeoutException e) {
+ extendLog.Log_E("TimeoutException :" + e);
+ mTask.cancel();
+ }
+ }
+}
Added: trunk/src/Android/SmartUpLoad_main/src/smartUpLoad/or/jp/SmartUpLoad_HttpManager.java
===================================================================
--- trunk/src/Android/SmartUpLoad_main/src/smartUpLoad/or/jp/SmartUpLoad_HttpManager.java (rev 0)
+++ trunk/src/Android/SmartUpLoad_main/src/smartUpLoad/or/jp/SmartUpLoad_HttpManager.java 2012-07-14 15:44:25 UTC (rev 158)
@@ -0,0 +1,1199 @@
+package smartUpLoad.or.jp;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Formatter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.NameValuePair;
+import org.apache.http.ParseException;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.params.BasicHttpParams;
+import org.apache.http.params.HttpConnectionParams;
+import org.apache.http.params.HttpParams;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+import android.R.raw;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.AssetManager;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.location.GpsStatus.NmeaListener;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.net.NetworkInfo.State;
+import android.net.wifi.WifiManager;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Message;
+import android.widget.Toast;
+
+public class SmartUpLoad_HttpManager {
+
+
+ /* -------------------------------------------- クラウドサーバ関連 -------------------------------------------*/
+ /** POST送信時に付加するヘッダ */
+ private static final String HTTP_ORIGINAL_HEADER = "__SmartMeter_PASITS__";
+ /** クラウドサーバURL */
+ private static final String CLOUD_SERVER_URL = "http://192.168.11.2/test/index.php";
+
+ /** リクエストコード */
+ private enum REQUEST_CODE {
+ ELSE,
+ SCENARIO,
+ JPEG,
+ ;
+ }
+
+ /* -------------------------------------------- クラウドサーバ関連 -------------------------------------------*/
+
+ /** [シナリオ番号][画像パスID]で識別 */
+/* Y.Narisawa 2012/04/13 仕様変更 M社/N社ルート選択可能対応 S */
+ private String[][] mScenarioPathArray = new String[6][];
+/* Y.Narisawa 2012/04/13 仕様変更 M社/N社ルート選択可能対応 E */
+ private int mNowNavigatingScenario = -1;
+ /** 現在選択中のシナリオ */
+ private int mScenario = 0;
+ /** 現在の画像パスID */
+ private int mNowLocation = 0;
+
+ /** 読み込む画像データのベースとなるティレクトリ<br>ローカルから画像を取得するときはさらに"/local_image"を追加 */
+ private String mBasedir = null;
+ /** 画像ファイル格納フォルダパス */
+ private final String APPDIR_PATH = "/AppDirectory/hogehoge/test"; // ファイル出力パス
+// /** シナリオデータロード済みフラグ */
+// private boolean mLoadedFlg = false;
+ private SmartUpLoad_Cancelable mConnectedTask = null;
+ /** 位置データ更新およびシナリオデータ取得スレッド用ExecutorService */
+ private ExecutorService mExecNavi;
+ /** SmtMtrServiceインスタンス */
+ private SmtMtrService mService;
+ /** 位置データ更新間隔 */
+ private long mInterval = 1000;
+ /** SmtMtrNaviActivityのハンドラ */
+// private Handler mNaviActivityHandler = null;
+
+ /** 現在読み込んでいる画像の番号 */
+// private int mNowLoadingID = 0;
+ private String mNowId = null;
+ /** ローカルに保存されている画像パス数 */
+ private final static int LOCAL_IMAGE_NUMBER = 57;
+ /** シナリオが取得できなかった場合に代わりに読み込む画像パス一覧 */
+ private final static String LOCAL_IMAGE_PATH_DIRECTORY = "/local_image";
+
+ /* -------------------------------------------- HTTP(天気)関連 -------------------------------------------*/
+ private static String baseURL = "http://www.google.com/ig/api?weather";
+ private static String bottomURL = "&hl=ja";
+ /* ================= MAIN INFORMATION ================= */
+ private final String MAIN_INFORMATION_Element = "forecast_information";
+ private final String ATTR_CITY = "city";
+ private final String ATTR_POSAL_CODE = "postal_code";
+ private final String ATTR_FORECAST = "forecast_date";
+ /* ================= CURRENT DATA ================= */
+ private final String CURRENT_DATA_ELEMENT = "current_conditions";
+ private final String ATTR_CONDITION = "condition";
+ private final String ATTR_TEMP_F = "temp_f";
+ private final String ATTR_TEMP_C = "temp_c";
+ private final String ATTR_HUMIDITY = "humidity";
+ private final String ATTR_WIND_CONDTION = "wind_condition";
+ /* ================= OTHER DATA ================= */
+
+ /* -------------------------------------------- 矢印ナビ関連 -------------------------------------------*/
+ static final byte NAVI_STATUS_NOT_NAVIGATING = (byte)0x01;
+ static final byte NAVI_STATUS_NAVIGATING = (byte)0x02;
+ static final byte NAVI_STATUS_SEARCHING_ROUTE = (byte)0x03;
+ private byte mNaviStatus = NAVI_STATUS_NOT_NAVIGATING;
+
+
+ /**
+ * コンストラクタ
+ * @param service SmtMtrService
+ */
+ public SmartUpLoad_HttpManager(SmtMtrService service) {
+ SmtMtrLog.SmtMtrLog_D();
+ this.mService = service;
+ mExecNavi = Executors.newFixedThreadPool(1);
+
+ // ベースティレクトリ名取得
+ mBasedir = new File(Environment.
+ getExternalStorageDirectory(),APPDIR_PATH).getPath();
+
+ SmtMtrLog.SmtMtrLog_D();
+ }
+
+ /**
+ * 起動しているスレッドを止める
+ */
+ public void shutdown() {
+ SmtMtrLog.SmtMtrLog_D();
+ if(mConnectedTask != null) {
+ mConnectedTask.cancel();
+ }
+ else {
+ SmtMtrLog.SmtMtrLog_D("mConnectedTask is null");
+ }
+ SmtMtrLog.SmtMtrLog_D();
+ }
+
+ /**
+ * シナリオ取得要求
+ * @param scenario シナリオ番号
+ * @param interval 位置情報更新間隔
+ */
+ public void getScenario(int scenario, long interval) {
+ SmtMtrLog.SmtMtrLog_D();
+
+ // SmtMtrNaviActivityのハンドラを取得
+ // コンストラクタで取得するとアクティビティが立ち上がっていないため、nullとなってしまう
+// mNaviActivityHandler = mService.getActivityHandler(SmtMtrNaviActivity.class.getName());
+
+ mInterval = interval;
+ mScenario = scenario;
+ SmartUpLoad_Cancelable task = new LoadImageTask(mScenario);
+ mService.executeTask(mExecNavi, task, 0, null);
+ mConnectedTask = task;
+ SmtMtrLog.SmtMtrLog_D();
+ }
+
+ /**
+ * 案内開始処理
+ * @param scenario
+ */
+ public void startNavi(int scenario, long interval) {
+ SmtMtrLog.SmtMtrLog_D();
+ mScenario = scenario;
+ SmartUpLoad_Cancelable task = new NavigateTask(mScenario);
+ mService.executeTask(mExecNavi, task, 0, null);
+ mConnectedTask = task;
+ SmtMtrLog.SmtMtrLog_D();
+ }
+
+ /**
+ * 案内一時停止処理
+ */
+ public void pauseNavi() {
+ SmtMtrLog.SmtMtrLog_D();
+ if(mConnectedTask != null) {
+ mConnectedTask.cancel();
+ }
+ else {
+ SmtMtrLog.SmtMtrLog_D("mConnectedTask is null");
+ }
+ SmtMtrLog.SmtMtrLog_D();
+ }
+
+ /**
+ * ナビの状態を取得する
+ * @return
+ */
+ public byte getNaviStatus() {
+ SmtMtrLog.SmtMtrLog_D();
+ return mNaviStatus;
+ }
+
+
+ /**
+ * 画像の取得およびローカルへの保存タスク
+ * @author hterashima
+ *
+ */
+ private class LoadImageTask implements SmartUpLoad_Cancelable {
+
+ int mmLength = LOCAL_IMAGE_NUMBER; // ファイル数(初期値は)
+// String[] mmRetStr = null; // 返却用ファイルパス配列
+ int mmScenario = -1;
+
+// /**
+// * コンストラクタ
+// * @param data ファイルのデータ
+// */
+// public LoadImageTask(String[] data) {
+// SmtMtrLog.SmtMtrLog_D();
+// this.retStr = data;
+// length = retStr.length;
+// SmtMtrLog.SmtMtrLog_D();
+// }
+
+ /**
+ * コンストラクタ
+ * @param scenario シナリオ番号
+ */
+ public LoadImageTask(int scenario) {
+ SmtMtrLog.SmtMtrLog_D();
+ this.mmScenario = scenario;
+ SmtMtrLog.SmtMtrLog_D();
+ }
+
+ @Override
+ public void run() {
+ SmtMtrLog.SmtMtrLog_D();
+
+ // 2012.2.6 H.Terashima ADD
+ mNaviStatus = NAVI_STATUS_SEARCHING_ROUTE;
+ // 2012.2.6 H.Terashima ADD
+
+ try {
+ // 選択したシナリオの画像データが存在しない場合(まだロードされていない場合)
+ if(mScenarioPathArray[mmScenario] == null) {
+ SmtMtrLog.SmtMtrLog_D("no scenario data");
+
+ // wifi接続状態取得
+ ConnectivityManager conMan = (ConnectivityManager)mService.getSystemService(Context.CONNECTIVITY_SERVICE);
+ State wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
+
+ // WiFi接続されている場合
+ if (wifi == State.CONNECTED) {
+ SmtMtrLog.SmtMtrLog_D("wifi connected");
+ // クラウドサーバからデータ読み込み
+ loadCloudData(mmScenario);
+ }
+ // WiFi接続されていない場合
+ else {
+ SmtMtrLog.SmtMtrLog_E("wif not connected");
+ // ローカルからデータ読み込み
+ loadLocalData(mmScenario);
+ }
+ }
+ // 選択したシナリオがすでに読み込まれていた場合
+ else {
+ SmtMtrLog.SmtMtrLog_E("already loaded scenario " + mmScenario);
+ }
+
+ // 画像の読み込み完了
+ loadedImage();
+
+ } catch (Exception e) {
+ SmtMtrLog.SmtMtrLog_E("Exception :" + e);
+ e.printStackTrace();
+ SmtMtrLog.SmtMtrLog_E("error load data");
+ sendMessage(mService.mHandler, SmtMtrService.HANDLE_MSG_ARROW_NAVI, SmtMtrService.ERROR, 0, null);
+ }
+
+ // 2012.2.6 H.Terashima ADD
+ mNaviStatus = NAVI_STATUS_NOT_NAVIGATING;
+ // 2012.2.6 H.Terashima ADD
+
+ SmtMtrLog.SmtMtrLog_D();
+ }
+
+ /**
+ * クラウドサーバからデータを読み出し
+ * @param scenario
+ */
+ void loadCloudData(int scenario) throws Exception{
+ SmtMtrLog.SmtMtrLog_D();
+ try {
+ // シナリオ取得
+ String rawData = sendPost(CLOUD_SERVER_URL, REQUEST_CODE.SCENARIO, String.valueOf(mmScenario + 1));
+ SmtMtrLog.SmtMtrLog_D("rawData : " + rawData);
+
+ if(rawData != null && !rawData.equals("null")) {
+ SmtMtrLog.SmtMtrLog_D("exist data");
+ // データの解析
+ // data[画像ID][取得カラム] カラム→0:ID、1:PATH
+ String[][] data = analyzeJson(rawData);
+
+ // データが正常な場合
+ if(data != null && data.length > 0) {
+ SmtMtrLog.SmtMtrLog_D("complete analyze response data");
+ mmLength = data.length;
+
+ mScenarioPathArray[mmScenario] = new String[mmLength];
+
+ String tempStr = null;
+ // 画像読み込み開始
+ for(int i = 0; i < mmLength; i++) {
+ mNowId = data[i][0];
+ try {
+ // HTTP経由で画像パス取得
+ tempStr = sendPost(CLOUD_SERVER_URL, REQUEST_CODE.JPEG, data[i][1]);
+// mScenarioPathArray[mmScenario][i] = sendPost(CLOUD_SERVER_URL, REQUEST_CODE.JPEG, data[i][1]);
+
+ /* 2012.1.28 H.Terashima PT ADD S*/
+ /* sendPost内でExceptionが発生してもローカルデータを取得できるように修正 */
+ if(tempStr != null) {
+ mScenarioPathArray[mmScenario][i] = tempStr;
+ }
+ else {
+ // 戻り値がnullの場合はローカルパスの取得
+ throw new Exception();
+ }
+ tempStr = null;
+ /* 2012.1.28 H.Terashima PT ADD E*/
+ } catch (Exception e) {
+ SmtMtrLog.SmtMtrLog_E("Exception :" + e);
+ // 画像取得中にWiFi接続が切れた等のエラーが発生した場合にローカルから読み出す
+ SmtMtrLog.SmtMtrLog_E("error load image from cloud. so get from local");
+ // ローカルから読み込み
+ mScenarioPathArray[mmScenario][i] = getFileName(mBasedir + LOCAL_IMAGE_PATH_DIRECTORY, mNowId);
+ }
+ SmtMtrLog.SmtMtrLog_D(mScenarioPathArray[mmScenario][i]);
+ }
+ }
+ // データが正常でない場合
+ else {
+ SmtMtrLog.SmtMtrLog_E("data is duplicate");
+ // ローカルからの読み出し
+ loadLocalData(scenario);
+ }
+ }
+ /* ---------------------- MT ------------------------ */
+ // データが正常でない場合
+ else {
+ SmtMtrLog.SmtMtrLog_E("data is duplicate");
+ // ローカルからの読み出し
+ loadLocalData(scenario);
+ }
+ } catch(Exception e) {
+ SmtMtrLog.SmtMtrLog_E("Exception :" + e);
+ SmtMtrLog.SmtMtrLog_E("error");
+ e.printStackTrace();
+ throw new Exception(e.getMessage());
+ }
+ SmtMtrLog.SmtMtrLog_D();
+ }
+
+ /**
+ * ローカルに保存しているデータの読み出し
+ * @param scenario
+ */
+ void loadLocalData(int scenario) throws Exception{
+ SmtMtrLog.SmtMtrLog_D();
+ // 生データ取得
+ String rawData = getLocalData(scenario);
+ // データ解析
+ String[][] data = analyzeJson(rawData);
+ if(data != null && 0 < data.length) {
+ mmLength = data.length;
+ // 初期化
+ mScenarioPathArray[mmScenario] = new String[mmLength];
+ for(int i = 0; i < mmLength; i++) {
+ // ローカルから読み込み
+ mScenarioPathArray[mmScenario][i] = getFileName(mBasedir + LOCAL_IMAGE_PATH_DIRECTORY, data[i][0]);
+
+ SmtMtrLog.SmtMtrLog_D(mScenarioPathArray[mmScenario][i]);
+ }
+ }
+ else {
+ SmtMtrLog.SmtMtrLog_E("error not found local data");
+ throw new Exception("ローカルにデータがありません");
+ }
+ SmtMtrLog.SmtMtrLog_D();
+ }
+
+ /**
+ * ローカルデータ読み出し<br>
+ * このプロジェクトのassetsフォルダにJSON形式で保存してあるファイルを読み込む
+ * @param scenario
+ * @return
+ */
+ private String getLocalData(int scenario) {
+ SmtMtrLog.SmtMtrLog_D();
+
+ AssetManager as = mService.getResources().getAssets();
+ InputStream is = null;
+ BufferedReader br = null;
+
+ StringBuilder sb = new StringBuilder();
+ try {
+ try {
+ is = as.open("scenario" + (scenario + 1) + ".txt");
+ br = new BufferedReader(new InputStreamReader(is));
+
+ String str;
+ while ((str = br.readLine()) != null) {
+ sb.append(str + "\n");
+ }
+ SmtMtrLog.SmtMtrLog_D("return string : " + sb.toString());
+ } finally {
+ if (br != null)
+ br.close();
+ }
+ } catch (IOException e) {
+ SmtMtrLog.SmtMtrLog_E("IOException :" + e);
+ SmtMtrLog.SmtMtrLog_E("error load local data");
+ e.printStackTrace();
+ } catch (Exception e) {
+ SmtMtrLog.SmtMtrLog_E("Exception :" + e);
+ SmtMtrLog.SmtMtrLog_E("error load local data");
+ e.printStackTrace();
+ }
+ SmtMtrLog.SmtMtrLog_D();
+ return sb.toString();
+ }
+
+ /**
+ * 画像読み込み完了処理
+ */
+ void loadedImage() {
+ SmtMtrLog.SmtMtrLog_D();
+ // ナビ画面に画像読み込み終了通知を投げる
+// Intent intent = new Intent(SmtMtrNaviActivity.ACTION_ARROW_NAVI_ACTIVITY_MSG);
+// intent.putExtra(SmtMtrService.INTENT_KEY_KIND, SmtMtrService.FINISH_LOAD_IMAGE);
+// mService.sendStickyBroadcast(intent);
+// sendMessage(mService.mHandler, SmtMtrService.HANDLE_MSG_ARROW_NAVI, SmtMtrService.FINISH_LOAD_IMAGE, 0, null);
+ // 一度サービスを介してナビ画面に通知
+ sendMessage(mService.mHandler, SmtMtrService.HANDLE_MSG_ARROW_NAVI, SmtMtrService.COMPLETE, 0, null);
+
+ SmtMtrLog.SmtMtrLog_D();
+ }
+
+ @Override
+ public void cancel() {
+ SmtMtrLog.SmtMtrLog_D();
+ SmtMtrLog.SmtMtrLog_D();
+ }
+ }
+
+ /**
+ * 画像描画タスク
+ */
+ private final class NavigateTask implements SmartUpLoad_Cancelable {
+
+ boolean flg = true; // ループフラグ
+// private String[] filepath; // ファイルパス
+// private Bitmap bitmap; // ビットマップ
+
+// /**
+// * コンストラクタ
+// * @param filepath ファイルパス
+// */
+// public NavigateTask(String[] filepath) {
+// SmtMtrLog.SmtMtrLog_D();
+// this.filepath = filepath;
+// SmtMtrLog.SmtMtrLog_D();
+// }
+
+ /**
+ * コンストラクタ
+ * @param scenario シナリオ番号
+ */
+ public NavigateTask(final int scenario) {
+ SmtMtrLog.SmtMtrLog_D();
+ // 開始要求のシナリオが現在案内中のシナリオでない場合
+ // シナリオが一致した場合は案内再開処理となる
+ // 2012.2.1 H.Terashima 同じルートを再選択した場合も最初から案内を始めるように修正
+// if(scenario != mNowNavigatingScenario) {
+ // 位置情報初期化
+ mNowLocation = 0;
+// }
+// else {
+// SmtMtrLog.SmtMtrLog_E("scenario is now navigating scenario");
+// }
+ mNowNavigatingScenario = scenario;
+ SmtMtrLog.SmtMtrLog_D("location total : " + mScenarioPathArray[scenario].length);
+ SmtMtrLog.SmtMtrLog_D();
+ }
+
+ /**
+ * スレッド実行
+ */
+ public void run() {
+ SmtMtrLog.SmtMtrLog_D();
+// int count = mNowLocation; // カウンタ
+
+ // 2012.2.6 H.Terashima ADD
+ mNaviStatus = NAVI_STATUS_NAVIGATING;
+ // 2012.2.6 H.Terashima ADD
+
+ // flgがtrueである限りループ
+ try {
+ while (flg) {
+ SmtMtrLog.SmtMtrLog_D("now location " + mNowLocation);
+
+ // SmtMtrServiceにメッセージ送信
+ sendMessage(mService.mHandler, SmtMtrService.HANDLE_MSG_ARROW_NAVI,
+ SmtMtrService.UPDATE_INFOMATION, mNowLocation, mScenarioPathArray[mNowNavigatingScenario][mNowLocation]);
+
+ // インクリメント
+ mNowLocation++;
+
+ // カウンタが総ファイル以上の場合
+ if(mNowLocation >= mScenarioPathArray[mNowNavigatingScenario].length) {
+ // ナビ画面に案内終了通知を投げる
+
+ sendMessage(mService.mHandler, SmtMtrService.HANDLE_MSG_ARROW_NAVI, SmtMtrService.STOP, 0, null);
+
+ // 現在位置情報初期化
+ mNowLocation = 0;
+
+ SmtMtrLog.SmtMtrLog_D("finish navi");
+ cancel();
+ // 案内を終了する
+ break;
+ }
+
+ // 指定秒数待機
+ Thread.sleep(mInterval);
+ }
+ } catch (Exception e) {
+ SmtMtrLog.SmtMtrLog_E("Exception :" + e);
+// cancel();
+ SmtMtrLog.SmtMtrLog_E("navigation error");
+ sendMessage(mService.mHandler, SmtMtrService.HANDLE_MSG_ARROW_NAVI, SmtMtrService.ERROR, 0, null);
+ e.printStackTrace();
+ }
+
+ // 2012.2.6 H.Terashima ADD
+ mNaviStatus = NAVI_STATUS_NOT_NAVIGATING;
+ // 2012.2.6 H.Terashima ADD
+
+ SmtMtrLog.SmtMtrLog_D();
+ }
+
+ /**
+ * キャンセル処理
+ */
+ @Override
+ public void cancel() {
+ SmtMtrLog.SmtMtrLog_D();
+ // ループを止める
+ this.flg = false;
+
+ SmtMtrLog.SmtMtrLog_D();
+ }
+ }
+
+ /**
+ * ハンドラメッセージを送信する
+ * @param handler
+ * @param what
+ * @param arg1
+ * @param arg2
+ * @param obj
+ */
+ private void sendMessage(Handler handler, int what, int arg1, int arg2, Object obj) {
+ SmtMtrLog.SmtMtrLog_D();
+ if(handler != null) {
+ Message msg = Message.obtain();
+ msg.what = what;
+ msg.arg1 = arg1;
+ msg.arg2 = arg2;
+ msg.obj = obj;
+
+ handler.sendMessage(msg);
+
+// msg.recycle();
+ }
+ else {
+ SmtMtrLog.SmtMtrLog_E("handler is null");
+ }
+ SmtMtrLog.SmtMtrLog_D();
+ }
+
+ /**
+ * POST要求で送信するメッセージを作成する
+ * @param requestCode
+ * @param params
+ */
+ private List<NameValuePair> makePostMessage(REQUEST_CODE requestCode, String params) {
+ SmtMtrLog.SmtMtrLog_D();
+
+ String bodyData = convertJsonFormat(requestCode.name(), params);
+ List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(3);
+ nameValuePair.add(new BasicNameValuePair("HEADER", HTTP_ORIGINAL_HEADER)); // ヘッダの設定
+ nameValuePair.add(new BasicNameValuePair("LENGTH", String.valueOf(bodyData.length()))); // サイズの設定
+ nameValuePair.add(new BasicNameValuePair("BODY", bodyData)); // 中身の設定
+
+ SmtMtrLog.SmtMtrLog_D("send data : " + nameValuePair.toString());
+ SmtMtrLog.SmtMtrLog_D();
+ return nameValuePair;
+ }
+
+ /**
+ * POST要求で送信するデータをJSON形式に変換する
+ * @param requestCode
+ * @param data
+ * @return
+ */
+ private String convertJsonFormat(String kind, String params) {
+ SmtMtrLog.SmtMtrLog_D();
+ String retStr = null;
+
+ try {
+ JSONObject obj = new JSONObject();
+ JSONObject childObj = new JSONObject();
+ childObj.put("KIND", kind);
+ childObj.put("DATA", params);
+ // 親設定
+ obj.put("REQUEST",childObj);
+ retStr = obj.toString();
+ SmtMtrLog.SmtMtrLog_D("send data : " + retStr);
+ } catch(JSONException e) {
+ SmtMtrLog.SmtMtrLog_E("JSONException :" + e);
+ e.printStackTrace();
+ retStr = null;
+ SmtMtrLog.SmtMtrLog_E("error convert json");
+ }
+ SmtMtrLog.SmtMtrLog_D();
+ return retStr;
+ }
+ /**
+ * POST要求を送信する
+ * @param url 要求送信先URL
+ * @param frame フォーマットを適用した送信データ「HEADER,LENGTH,BODY」
+ * @param requestCode リクエストコード
+ * @return
+ */
+ private String sendPost(String url, final REQUEST_CODE requestCode, String params) {
+ SmtMtrLog.SmtMtrLog_D();
+
+ String retStr = null;
+ try {
+ HttpPost method = new HttpPost(url);
+
+ HttpParams httpParams = new BasicHttpParams();
+ // Set the timeout in milliseconds until a connection is established.
+ int timeoutConnection = 1000;
+ HttpConnectionParams.setConnectionTimeout(httpParams, timeoutConnection);
+ // Set the default socket timeout (SO_TIMEOUT)
+ // in milliseconds which is the timeout for waiting for data.
+ int timeoutSocket = 1000;
+ HttpConnectionParams.setSoTimeout(httpParams, timeoutSocket);
+
+ DefaultHttpClient client = new DefaultHttpClient(httpParams);
+ // POST データの設定
+// StringEntity paramEntity = new StringEntity(params);
+// paramEntity.setChunked(false);
+// paramEntity.setContentType("application/x-wwww-form-urlencoded");
+ method.setEntity(new UrlEncodedFormEntity(makePostMessage(requestCode, params)));
+
+ retStr = client.execute(method, new ResponseHandler<String>() {
+ @Override
+ public String handleResponse(HttpResponse response)
+ throws ClientProtocolException, IOException {
+ SmtMtrLog.SmtMtrLog_D();
+
+ // response.getStatusLine().getStatusCode()でレスポンスコードを判定する。
+ // 正常に通信できた場合、HttpStatus.SC_OK(HTTP 200)となる。
+ switch (response.getStatusLine().getStatusCode()) {
+ case HttpStatus.SC_OK:
+ SmtMtrLog.SmtMtrLog_D("response SC_OK");
+ // レスポンス受信処理
+ return recvResponse(response, requestCode);
+ case HttpStatus.SC_NOT_FOUND:
+ SmtMtrLog.SmtMtrLog_E("response SC_NOT_FOUNT");
+ throw new RuntimeException("データがありません");
+ default:
+ SmtMtrLog.SmtMtrLog_E("response error");
+ throw new RuntimeException("通信エラー");
+ }
+ }
+ });
+ } catch (ClientProtocolException e) {
+ SmtMtrLog.SmtMtrLog_E("ClientProtocolException :" + e);
+ e.printStackTrace();
+ SmtMtrLog.SmtMtrLog_E("error HTTP POST");
+ return retStr;
+ } catch (IOException e) {
+ SmtMtrLog.SmtMtrLog_E("IOException :" + e);
+ e.printStackTrace();
+ SmtMtrLog.SmtMtrLog_E("error HTTP POST");
+ return retStr;
+ } catch (Exception e) {
+ SmtMtrLog.SmtMtrLog_E("Exception :" + e);
+ e.printStackTrace();
+ SmtMtrLog.SmtMtrLog_E("error HTTP POST");
+ return retStr;
+ }
+
+ SmtMtrLog.SmtMtrLog_D();
+ return retStr;
+ }
+
+ /**
+ * レスポンス受信処理
+ * @param response
+ * @param requestCode
+ * @return
+ * @throws IOException
+ * @throws ParseException
+ */
+ private String recvResponse(HttpResponse response, REQUEST_CODE requestCode) throws ParseException, IOException {
+ SmtMtrLog.SmtMtrLog_D();
+ // レスポンスデータを文字列として取得する。
+ String retStr = null;
+ switch(requestCode) {
+ case SCENARIO:
+ SmtMtrLog.SmtMtrLog_D("response for SCENARIO");
+ retStr = EntityUtils.toString(response.getEntity(), "UTF-8");
+ break;
+ // 画像取得リクエストを送信した場合
+ case JPEG:
+ SmtMtrLog.SmtMtrLog_D("response for JPEG");
+ // ファイルの保存
+ // 返却値はファイル名
+ retStr = writeFile(response.getEntity().getContent());
+ break;
+ }
+ SmtMtrLog.SmtMtrLog_D();
+ return retStr;
+ }
+
+ /**
+ * HTTP通信(GET)を行う
+ * @param str ファイル名およびファイルパスの配列
+ * @return 画像ファイル名
+ */
+ public String callHttpGetMethod(String sUrl) {
+
+ // HTTPクライアントを生成
+ HttpClient objHttp = new DefaultHttpClient();
+ // タイムアウト設定のためにパラメータを取得
+ HttpParams params = objHttp.getParams();
+ HttpConnectionParams.setConnectionTimeout(params, 1000); //接続のタイムアウト
+ HttpConnectionParams.setSoTimeout(params, 5000); //データ取得のタイムアウト
+ String sReturn = null;
+
+ try {
+ HttpGet objGet = new HttpGet(sUrl);
+ HttpResponse objResponse = objHttp.execute(objGet);
+ if (objResponse.getStatusLine().getStatusCode() < 400){
+ sReturn = EntityUtils.toString(objResponse.getEntity(), "UTF-8");
+ }
+ } catch (IOException e) {
+ SmtMtrLog.SmtMtrLog_E("IOException :" + e);
+ SmtMtrLog.SmtMtrLog_D("data none");
+ return sReturn;
+ }
+ return sReturn;
+ }
+
+
+
+
+ /**
+ * 受け取ったデータをローカルに保存する
+ * @param in HTTPレスポンスの入力ストリーム
+ * @return ローカルに保存したファイル名
+ */
+ private String writeFile(InputStream in) {
+ SmtMtrLog.SmtMtrLog_D();
+
+ String retStr = null; // 返却文字列
+ int BUFFER_SIZE = 1024; // 最大バッファサイズ
+ byte[] buffer = null; // バッファ
+ int size = 0; // バッファサイズ
+
+ try {
+
+ BufferedInputStream bufferedInputStream = new BufferedInputStream(in, BUFFER_SIZE);
+
+ // ファイル名作成
+ retStr = getFileName(mBasedir, mNowId);
+
+ // ファイルの取得
+ File file = new File(retStr);
+ // ファイルの生成
+ if(file.createNewFile()) {
+ SmtMtrLog.SmtMtrLog_D("create new file");
+ }
+ else {
+ SmtMtrLog.SmtMtrLog_D("exist file");
+ }
+
+ // 出力ストリームの作成
+ BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file, false), BUFFER_SIZE);
+
+ buffer = new byte[BUFFER_SIZE];
+
+ while(true) {
+ // データ読み込み
+ size = bufferedInputStream.read(buffer);
+
+ // バッファの中身がある場合
+ if(-1 != size) {
+ bufferedOutputStream.write(buffer, 0, size);
+ }
+ else {
+ break;
+ }
+ }
+
+ // 入出力ストリーム終了処理
+ bufferedOutputStream.flush();
+ bufferedOutputStream.close();
+ bufferedInputStream.close();
+
+ } catch(IOException e) {
+ SmtMtrLog.SmtMtrLog_E("IOException :" + e);
+ e.printStackTrace();
+ SmtMtrLog.SmtMtrLog_E("file write error");
+ } catch (Exception e) {
+ SmtMtrLog.SmtMtrLog_E("Exception :" + e);
+ e.printStackTrace();
+ SmtMtrLog.SmtMtrLog_E("file write error");
+ }
+ SmtMtrLog.SmtMtrLog_D();
+ return retStr;
+ }
+
+
+ /**
+ * JSON形式の文字列を解析し、画像のURLを取得する
+ * @param json JSON形式の文字列
+ * @return 画像のURL
+ */
+ private String[][] analyzeJson(String json) {
+ SmtMtrLog.SmtMtrLog_D();
+
+ // 返却用文字列配列
+// String[] data = null;
+ String[][] data = null;
+
+ try {
+ // JSONオブジェクト取得
+ JSONObject obj = new JSONObject(json);
+ // JSON形式の配列取得
+ JSONArray ar = obj.getJSONArray("RESPONSE");
+ // 配列の長さ取得(データの個数)
+ int length = ar.length();
+
+ // 配列の初期化
+// data = new String[length];
+ data = new String[length][2];
+
+ // データ数分ループ
+ for(int i = 0 ; i < ar.length(); i++)
+ {
+ // ファイルパスを格納
+// data[i] = ar.getJSONObject(i).getString("PATH");
+ data[i][0] = ar.getJSONObject(i).getString("ID");
+ data[i][1] = ar.getJSONObject(i).getString("PATH");
+ }
+ } catch (JSONException e) {
+ SmtMtrLog.SmtMtrLog_E("JSONException :" + e);
+ data = null;
+ e.printStackTrace();
+ SmtMtrLog.SmtMtrLog_E("analyze JSON error");
+ } catch (Exception e) {
+ SmtMtrLog.SmtMtrLog_E("Exception :" + e);
+ data = null;
+ e.printStackTrace();
+ SmtMtrLog.SmtMtrLog_E("analyze JSON error");
+ }
+ SmtMtrLog.SmtMtrLog_D();
+ return data;
+ }
+
+// /**
+// * 画像ファイル名を取得する<br>
+// * YYYYMMSS-hhmmss.jpg形式のファイル名を作成する
+// * @return ファイル名
+// */
+// private final String getFileName(){
+// SmtMtrLog.SmtMtrLog_D();
+// Formatter formatter = new Formatter();
+// Calendar calendar = Calendar.getInstance();
+// int year = calendar.get(Calendar.YEAR);
+// int month = calendar.get(Calendar.MONTH);
+// int day = calendar.get(Calendar.DAY_OF_MONTH);
+// int hour = calendar.get(Calendar.HOUR_OF_DAY);
+// int minute = calendar.get(Calendar.MINUTE);
+// int second = calendar.get(Calendar.SECOND);
+//
+// //YYYYMMSS-hhmmss.txt
+// formatter.format("%04d%02d%02d-%02d%02d%02d.jpg", year, month, day, hour, minute, second);
+//
+// SmtMtrLog.SmtMtrLog_D("FileName; " +formatter.toString());
+// SmtMtrLog.SmtMtrLog_D();
+// return formatter.toString();
+// }
+
+ /**
+ * ファイル名の取得<br>
+ * "画像ID.JPG"形式のファイル名をフルパスで返却する
+ * @param dir 保存先ディレクトリ
+ * @param id 画像ID
+ * @return
+ */
+ private String getFileName(String dir, String id) {
+ SmtMtrLog.SmtMtrLog_D();
+/* Y.Narisawa 2012/04/13 仕様変更 M社/N社ルート選択可能対応 S */
+// return dir + "/" + (mScenario + 1) + "_" +id + ".JPG";
+/* Y.Narisawa 2012/04/13 仕様変更 M社/N社ルート選択可能対応 E */
+ return dir + "/" + (mScenario + 1) + "/"+ (mScenario + 1) + "_" +id + ".JPG";
+ }
+
+
+
+ /* ============================================================== */
+ /* ここから天気専用処理 */
+ /* ============================================================== */
+ /**
+ * URI作成関数
+ * @param uri
+ * @param prefecture
+ * @param city
+ * @return
+ */
+ public String createUri(String prefecture, String city) {
+ SmtMtrLog.SmtMtrLog_D("start");
+ // メインのURLの作成を行う
+ StringBuilder mainUri = new StringBuilder();
+ if (baseURL.length() > 0) {
+ mainUri.append(baseURL);
+ }
+ if ((null != city) && (city.length() > 0)) {
+ mainUri.append("=");
+ mainUri.append(city);
+ if ((null != prefecture) && (prefecture.length() > 0)) {
+ mainUri.append(",");
+ mainUri.append(prefecture);
+ mainUri.append(bottomURL);
+ }
+ }
+ else {
+ if ((null != prefecture) && (prefecture.length() > 0)) {
+ mainUri.append("=");
+ mainUri.append(prefecture);
+ mainUri.append(bottomURL);
+ }
+ }
+ SmtMtrLog.SmtMtrLog_D("URI = " + mainUri.toString());
+ return mainUri.toString();
+ }
+
+ /**
+ * XML解析用メソッド
+ * @param xmlString
+ * @return
+ */
+ public String xmlParserUseSax(String xmlString) {
+
+ // ログ出力
+ SAXParserFactory factory = SAXParserFactory.newInstance();
+ try {
+ SmtMtrLog.SmtMtrLog_D("解析:start");
+ SAXParser parser = factory.newSAXParser();
+ XmlPaseHandler handler = new XmlPaseHandler();
+
+ InputStream bais = new ByteArrayInputStream(xmlString.getBytes());
+ //InputStream bais = new ByteArrayInputStream("Hello日本語".getBytes("utf-8"));
+
+ /* =============== 解析用データのセット =============== */
+ handler.setParseStringS_E_Flg(MAIN_INFORMATION_Element);
+ handler.setParseString(ATTR_CITY);
+ handler.setParseString(ATTR_POSAL_CODE);
+ handler.setParseString(ATTR_FORECAST);
+ handler.setParseStringS_E_Flg(CURRENT_DATA_ELEMENT);
+ handler.setParseString(ATTR_CONDITION);
+ handler.setParseString(ATTR_TEMP_F);
+ handler.setParseString(ATTR_TEMP_C);
+ handler.setParseString(ATTR_HUMIDITY);
+ handler.setParseString(ATTR_WIND_CONDTION);
+ /* =============== 解析用データのセット =============== */
+
+ parser.parse(bais, handler);
+ SmtMtrLog.SmtMtrLog_D("解析:終了");
+ // 以下関数か
+ Map tempMap = handler.getHashMap();
+
+ StringBuilder speechStr = new StringBuilder();
+
+ speechStr.append(" 、、、、");
+
+ speechStr.append("今日の、");
+// // 文字列取得と追加
+// String tempStr = (String)tempMap.get(ATTR_FORECAST);
+// String year = tempStr.substring(0, 3);
+// String month = tempStr.substring(5, 6);
+// String day = tempStr.substring(8, 9);
+// tempStr = tempStr.replaceFirst("-", "年、");
+// tempStr = tempStr.replaceFirst("-", "月");
+// speechStr.append(tempStr);
+// speechStr.append("日です。");
+// speechStr.append("出発地は札幌駅、");
+// speechStr.append("目的地は、旭山、動物園。");
+// speechStr.append("通過ポイントは、");
+// speechStr.append("1、札幌市、");
+// speechStr.append("2、いわみざわ市、");
+// speechStr.append("3、旭川市、です。");
+
+ String tempStr = (String)tempMap.get(ATTR_POSAL_CODE);
+ for (int i = 0; i < SmtMtrNaviTestData.mRecTable.length; i++) {
+ String tempStr2 = SmtMtrNaviTestData.mRecTable[i][2];
+ if (tempStr.equals(tempStr2)) {
+ tempStr = SmtMtrNaviTestData.mRecTable[i][3];
+ break;
+ }
+ }
+// 不具合対策
+ speechStr.append(tempStr);
+ speechStr.append("の天候は");
+ tempStr = (String)tempMap.get(ATTR_CONDITION);
+ speechStr.append(tempStr);
+ speechStr.append("、");
+ speechStr.append("気温は、");
+ tempStr = (String)tempMap.get(ATTR_TEMP_C);
+ Integer num = new Integer(tempStr);
+ int num2 = num.intValue();
+ if (num2 < 0) {
+ tempStr = tempStr.replaceFirst("-", "");
+ speechStr.append("マイナス");
+ speechStr.append(tempStr);
+ }
+ else {
+ speechStr.append(tempStr);
+ }
+ speechStr.append("度、です。");
+ if (num2 < 0) {
+ speechStr.append("路面が凍結している恐れがあります。");
+ speechStr.append("十分にお気をつけ下さい。");
+ }
+
+ SmtMtrLog.SmtMtrLog_D("解析:終了2" + speechStr.toString());
+ return speechStr.toString();
+
+ } catch (ParserConfigurationException e) {
+ SmtMtrLog.SmtMtrLog_E("ParserConfigurationException :" + e);
+ e.printStackTrace();
+ return null;
+ } catch (SAXException e) {
+ SmtMtrLog.SmtMtrLog_E("SAXException :" + e);
+ e.printStackTrace();
+ return null;
+ } catch (IOException e) {
+ SmtMtrLog.SmtMtrLog_E("IOException :" + e);
+ e.printStackTrace();
+ return null;
+ } catch (Exception e) {
+ SmtMtrLog.SmtMtrLog_E("Exception :" + e);
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ *
+ * @author ynarisawa
+ *
+ */
+ private class XmlPaseHandler extends DefaultHandler {
+
+ // バッファに追加
+ // 解析終了時にメインにメッセージを送信
+ private boolean parserFlg = false;
+ Map parseResult = new HashMap();
+ ArrayList<String> arrayList = new ArrayList<String>();
+ ArrayList<String> flgList = new ArrayList<String>();
+ /**
+ *
+ * @param getString
+ */
+ public void setParseString(String getString) {
+ arrayList.add(getString);
+ }
+ /**
+ *
+ * @param getString
+ */
+ public void setParseStringS_E_Flg(String getString) {
+ flgList.add(getString);
+ }
+ /**
+ *
+ */
+ @Override
+ public void startDocument() throws SAXException {
+ super.startDocument();
+ // LOG出力
+ SmtMtrLog.SmtMtrLog_D(":startDocument");
+ }
+ public Map getHashMap() {
+ return parseResult;
+ }
+
+ @Override
+ public void startElement(String uri, String localName, String qName,
+ Attributes attributes) throws SAXException {
+ super.startElement(uri, localName, qName, attributes);
+ // LOG出力
+ SmtMtrLog.SmtMtrLog_D(":startElement<" + uri + "_" + localName + "_" + qName + ">");
+ // 解析開始
+ for (int i = 0; i < flgList.size(); i++) {
+ if (flgList.get(i).equals(localName)) {
+ parserFlg = true;
+ }
+ }
+ if (parserFlg) {
+ for(int i=0; i<arrayList.size(); i++) {
+ for(int j=0; j<attributes.getLength(); j++) {
+ if (arrayList.get(i).equals(localName)) {
+ parseResult.put(localName, attributes.getValue(j));
+ }
+ }
+ }
+ }
+// for(int j=0; j<attributes.getLength(); j++) {
+// SmtMtrLog.SmtMtrLog_D(":characters<" + attributes.getLocalName(j) + "_" + attributes.getValue(j) + ">");
+// }
+ }
+
+ @Override
+ public void characters(char[] ch, int start, int length)
+ throws SAXException {
+ super.characters(ch, start, length);
+ String value = new String(ch, start, length);
+ SmtMtrLog.SmtMtrLog_D(":characters<" + value + ">");
+// writeToFile("characters() - ch = \"" + value + "\"\n");
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qName)
+ throws SAXException {
+ super.endElement(uri, localName, qName);
+ SmtMtrLog.SmtMtrLog_D(":endElement<"+ uri + "_" + localName + "_" + qName + ">");
+ // 解析開始
+ for (int i = 0; i < flgList.size(); i++) {
+ if (flgList.get(i).equals(localName)) {
+ parserFlg = false;
+ }
+ }
+ }
+
+ @Override
+ public void endDocument() throws SAXException {
+ super.endDocument();
+ SmtMtrLog.SmtMtrLog_D(":endDocument");
+ SmtMtrLog.SmtMtrLog_D(parseResult.toString());
+// writeToFile("endDocument()\n");
+ }
+ }
+}
\ No newline at end of file
Added: trunk/src/Android/SmartUpLoad_main/src/smartUpLoad/or/jp/extendLog.java
===================================================================
--- trunk/src/Android/SmartUpLoad_main/src/smartUpLoad/or/jp/extendLog.java (rev 0)
+++ trunk/src/Android/SmartUpLoad_main/src/smartUpLoad/or/jp/extendLog.java 2012-07-14 15:44:25 UTC (rev 158)
@@ -0,0 +1,384 @@
+package smartUpLoad.or.jp;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Calendar;
+import java.util.Formatter;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.Environment;
+import android.util.Log;
+
+/*
+ * className : Log出力用クラス
+ * date : 2011.11.22
+ * author : Y.Narisawa
+ * function : Logの出力を行うユーティリティ
+ */
+public class extendLog {
+
+ /* =============== メンバ変数 開始 =============== */
+ public static final int LOG_LEVEL_1 = 1; // loglevel 1
+ public static final int LOG_LEVEL_2 = 2; // loglevel 2
+ public static final int LOG_LEVEL_3 = 3; // loglevel 3
+
+ private static final String DEFAULT_DEBUG_LOG_TAG = "<<<_SMT_MTR_LOG_>>>"; // Log出力時のタグ名(デフォルト値)
+
+ private final static String APPDIR_PATH = "/AppDirectory/hogehoge/test";
+ private static FileOutputStream mFos = null;
+
+ private static final boolean SD_OUTPUT_FLAG = true;
+
+
+ /* =============== メンバ関数 開始 =============== */
+ /**
+ * @param logCtx
+ * : Contextを指定する
+ * @return AndroidManifest.xmlでandroid:debuggablがtrueかfalseか
+ */
+ private static boolean isDebugAble(Context logCtx) {
+ PackageManager manager = logCtx.getPackageManager();
+ ApplicationInfo appInfo = null;
+
+ boolean retFlg = false;
+
+ try {
+ appInfo = manager.getApplicationInfo(logCtx.getPackageName(), 0);
+ Thread.currentThread().getStackTrace()[1].getMethodName();
+ }
+ // エラー取得時
+ catch (NameNotFoundException e) {
+ Log.e(e.toString(), null);
+ return retFlg;
+ }
+ // デバッグフラグが有効な場合
+ if ((appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) == ApplicationInfo.FLAG_DEBUGGABLE) {
+ retFlg = true;
+ ;
+ }
+ return retFlg;
+ }
+
+ /**
+ * @param ctx
+ * Contextを指定する
+ * @param TAG
+ * logのTAG用の文字列
+ * @param msg
+ * デバッグ用のメッセージを指定
+ */
+ public static void Log_D(Context ctx, String TAG, String msg) {
+
+ if (isDebugAble(ctx)) {
+
+ String strData = Thread.currentThread().getStackTrace()[3]
+ .getFileName()
+ + ":"
+ + Thread.currentThread().getStackTrace()[3].getLineNumber()
+ + " "
+ + Thread.currentThread().getStackTrace()[3].getMethodName();
+
+ if(SD_OUTPUT_FLAG) {
+// write(strData + ":" + msg);
+ }
+ else {
+// Log.d(TAG, strData + ":" + msg);
+ }
+ }
+
+ }
+
+ /**
+ *
+ * @param ctx
+ * Contextを指定する
+ * @param msg
+ * デバッグ用のメッセージを指定
+ */
+ public static void Log_D(Context ctx, String msg) {
+
+ if (isDebugAble(ctx)) {
+ String strData = Thread.currentThread().getStackTrace()[3]
+ .getFileName()
+ + ":"
+ + Thread.currentThread().getStackTrace()[3].getLineNumber()
+ + " "
+ + Thread.currentThread().getStackTrace()[3].getMethodName();
+
+ if(SD_OUTPUT_FLAG) {
+// write(strData + ":" + msg);
+ }
+ else {
+// Log.d(DEFAULT_DEBUG_LOG_TAG, strData + ":" + msg);
+ }
+ }
+
+ }
+
+ /**
+ *
+ * @param msg
+ * デバッグ用のメッセージを指定
+ */
+ public static void Log_D(String msg) {
+ String strData = Thread.currentThread().getStackTrace()[3]
+ .getFileName()
+ + ":"
+ + Thread.currentThread().getStackTrace()[3].getLineNumber()
+ + " "
+ + Thread.currentThread().getStackTrace()[3].getMethodName();
+
+ if(SD_OUTPUT_FLAG) {
+// write(strData + ":" + msg);
+ }
+ else {
+// Log.d(DEFAULT_DEBUG_LOG_TAG, strData + ":" + msg);
+ }
+ }
+
+ /**
+ *
+ * @param ctx
+ * Contextを指定する
+ */
+ public static void Log_D(Context ctx) {
+
+ if (isDebugAble(ctx)) {
+ String strData = Thread.currentThread().getStackTrace()[3]
+ .getFileName()
+ + ":"
+ + Thread.currentThread().getStackTrace()[3].getLineNumber()
+ + " "
+ + Thread.currentThread().getStackTrace()[3].getMethodName();
+
+ if(SD_OUTPUT_FLAG) {
+// write(strData + ":traceLog");
+ }
+ else {
+// Log.d(DEFAULT_DEBUG_LOG_TAG, strData + ":traceLog");
+ }
+ }
+
+ }
+
+ /**
+ * なし
+ */
+ public static void Log_D() {
+ String strData = Thread.currentThread().getStackTrace()[3]
+ .getFileName()
+ + ":"
+ + Thread.currentThread().getStackTrace()[3].getLineNumber()
+ + " "
+ + Thread.currentThread().getStackTrace()[3].getMethodName();
+
+ if(SD_OUTPUT_FLAG) {
+// write(strData + ":traceLog");
+ }
+ else {
+// Log.d(DEFAULT_DEBUG_LOG_TAG, strData + ":traceLog");
+ }
+
+ }
+
+ /**
+ *
+ * @param ctx
+ * Contextを指定する
+ * @param msg
+ * デバッグ用のメッセージを指定
+ */
+ public static void Log_E(Context ctx, String msg) {
+
+ if (isDebugAble(ctx)) {
+ String strData = Thread.currentThread().getStackTrace()[3]
+ .getFileName()
+ + ":"
+ + Thread.currentThread().getStackTrace()[3].getLineNumber()
+ + " "
+ + Thread.currentThread().getStackTrace()[3].getMethodName();
+
+ if(SD_OUTPUT_FLAG) {
+// write(strData + ":" + msg);
+ }
+ else {
+// Log.e(DEFAULT_DEBUG_LOG_TAG, strData + ":" + msg);
+ }
+ }
+
+ }
+
+ /**
+ *
+ * @param msg
+ * デバッグ用のメッセージを指定
+ */
+ public static void Log_E(String msg) {
+ String strData = Thread.currentThread().getStackTrace()[3]
+ .getFileName()
+ + ":"
+ + Thread.currentThread().getStackTrace()[3].getLineNumber()
+ + " "
+ + Thread.currentThread().getStackTrace()[3].getMethodName();
+
+ if(SD_OUTPUT_FLAG) {
+// write(strData + ":" + msg);
+ }
+ else {
+// Log.e(DEFAULT_DEBUG_LOG_TAG, strData + ":" + msg);
+ }
+ }
+
+
+ /**
+ *
+ * @param ctx
+ * Contextを指定する
+ */
+ public static void Log_E(Context ctx) {
+
+ if (isDebugAble(ctx)) {
+ String strData = Thread.currentThread().getStackTrace()[3]
+ .getFileName()
+ + ":"
+ + Thread.currentThread().getStackTrace()[3].getLineNumber()
+ + " "
+ + Thread.currentThread().getStackTrace()[3].getMethodName();
+
+ if(SD_OUTPUT_FLAG) {
+// write(strData + ":traceLog");
+ }
+ else {
+// Log.e(DEFAULT_DEBUG_LOG_TAG, strData + ":traceLog");
+ }
+ }
+
+ }
+
+
+ /**
+ * なし
+ */
+ public static void Log_E() {
+
+ String strData = Thread.currentThread().getStackTrace()[3]
+ .getFileName()
+ + ":"
+ + Thread.currentThread().getStackTrace()[3].getLineNumber()
+ + " "
+ + Thread.currentThread().getStackTrace()[3].getMethodName();
+
+ if(SD_OUTPUT_FLAG) {
+// write(strData + ":traceLog");
+ }
+ else {
+// Log.e(DEFAULT_DEBUG_LOG_TAG, strData + ":traceLog");
+ }
+ }
+
+ /**
+ *
+ * @param msg
+ * デバッグ用のメッセージを指定
+ */
+ public static void Log_I(String msg) {
+ String strData = Thread.currentThread().getStackTrace()[3]
+ .getFileName()
+ + ":"
+ + Thread.currentThread().getStackTrace()[3].getLineNumber()
+ + " "
+ + Thread.currentThread().getStackTrace()[3].getMethodName();
+
+ if(SD_OUTPUT_FLAG) {
+ write(strData + ":" + msg);
+ }
+ else {
+ Log.i(DEFAULT_DEBUG_LOG_TAG, strData + ":" + msg);
+ }
+ }
+
+ /**
+ * ログ出力ファイルの作成
+ */
+ public static void createLogFile() {
+ File file = null;
+ try {
+ final File baseDir = new File(Environment.
+ getExternalStorageDirectory(),APPDIR_PATH + "/Log");
+
+ if(baseDir.mkdirs()) {
+ }
+ String dirPath = baseDir.getPath();
+
+ // ファイルの取得
+ file = new File(dirPath + "/" + getFileName());
+ // ファイルの生成
+ if(file.createNewFile()) {
+ extendLog.Log_D("create new file");
+ }
+ else {
+ extendLog.Log_D("exist file");
+ }
+
+ // 出力ストリームの作成
+ mFos = new FileOutputStream(file);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ /**
+ * ログファイルへの書き出し
+ * @param str
+ */
+ private static void write(String str) {
+ if(mFos != null) {
+ try {
+ // 現在時刻の取得
+ Calendar cal = Calendar.getInstance();
+ cal.setTimeInMillis(System.currentTimeMillis());
+ String time = cal.get(Calendar.MONTH) + "-" + cal.get(Calendar.DAY_OF_MONTH) + " "
+ + cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND) + "." + cal.get(Calendar.MILLISECOND);
+ str = time + " " + str + "\n";
+ // 出力ストリームの作成
+ mFos.write(str.getBytes());
+// mFos.write((str.concat("\n")).getBytes());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * ログファイルを閉じる
+ */
+ public static void closeLogFile() {
+ if(mFos != null) {
+ try {
+ mFos.close();
+ mFos = null;
+ } catch(IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private static String getFileName(){
+ Formatter formatter = new Formatter();
+ Calendar calendar = Calendar.getInstance();
+ int year = calendar.get(Calendar.YEAR);
+ int month = calendar.get(Calendar.MONTH) + 1;
+ int day = calendar.get(Calendar.DAY_OF_MONTH);
+ int hour = calendar.get(Calendar.HOUR_OF_DAY);
+ int minute = calendar.get(Calendar.MINUTE);
+ int second = calendar.get(Calendar.SECOND);
+
+ //YYYYMMSS-hhmmss.txt
+ formatter.format("Log_%04d%02d%02d-%02d%02d%02d.txt", year, month, day, hour, minute, second);
+ return formatter.toString();
+ }
+
+};
\ No newline at end of file