2010年4月23日 星期五

【應用】- Android 應用程式 : 「求救發訊器」- 即時地圖定位、緊急發送求救訊息。

Help Me! SOS : This software can text messages or email your Position through Android, it helps people who in dagerous place can be found quickly, leave it as soon as possible.
MIGHT NOT RECEIVE SIGNAL INDOORS FOR GPS (low GPS signal area).

看過卡通中的科南拿著有特殊功能的眼鏡追蹤被關起來的同伴位置嗎?
這個軟體雖沒那麼神奇,但卻可以讓你利用 Android 手機觀察你家小寶貝的所在位置,暗中保護你的小寶貝!而當自身發生危險時,亦可在第一時間通知你的親朋好友你的位置,讓你快點脫離困境或險境。

這是漁郎在 Android 應用程式的口袋名單中,排行第二個的項目。原本的構思,是來自於擔心小朋友在外的安全問題,但後來又從新聞報導得知有兩個人因沿著溪邊登山,卻在大雨後因河水暴漲無法沿溪回程而困在山中,警消人員費了許多心力才找到他們救下山。假如,這兩人當時手邊有可以發出含有 GPS 定位座標求救訊息的手機,那警消人員會不會比較容易找到他們呢?



這是一個讓您可以用 Android 手機,即時或定時的發出含有 GPS/A-GPS/Network 定位資訊或求救訊息的程式。漁郎在測試了大半個月,上山沒下海,走過高速公路,踏過鄉間小道後,終於除盡了雜草害蟲 (PS.據知還有 1 根草未除 >_< , 但不影響程式正常運作),發佈到 Android Market 讓有需要的朋友們使用。如使用上有改善的建議或缺失的指正,請朋友們不吝用 E-Mail 或回應在網誌上讓漁郎知曉,讓漁郎能不斷改善程式的品質與功能。

[程式安裝與相關限制說明]

(1) 適用手機平台:Android 1.5 以上,需有 GPS/A-GPS/Network 定位元件與電子羅盤

(2) 接收訊息平台:只要是可以收簡訊、電子郵件的手機或電腦即可,不限定非 Android 手機不可。

(3) 地圖定位顯示:只要是可以開啟網頁的手機或電腦即可。

(4) 限制:本程式由於是使用 Google Maps API,因此,必須連上數據網路才能使用。然而,除了使用 WiFi 連網外,在使用『行動網路』連網時,請最好是使用 3G/HSDPA ,這樣地圖下載更新的速度才跟得上GPS定位的速度 (高速公路測試的結果),並且申請上網吃到飽的服務 (例如中華電的 mPro950),漁郎在測試時由於沒申請上網吃到飽的服務,這個月的帳單‧‧‧好想哭 >_<

(5) 下載:在手機上使用 Android Market 搜尋 "求救發訊器"、"Help Me! SOS"、"com.e68club.android.HelpMeSOS" 或以 QR Code Scanner 掃描以下 QR Code 或點選這裡連到網頁版的 Android Market:


[程式使用說明]

(1) 主要畫面:即時定位標示地圖

此一主畫面程式,除了可拿來當作即時定位地圖使用外,亦可讓您在發出求救訊號之前,可先確定一下 GPS/A-GPS 定位有沒問題。這裡漁郎一直想要把地圖能隨著電子羅盤轉向前方,但一直搞不定,也就是說這個功能是我前面所說未拔掉的那 1 根草 @@,能否有哪位「強手強手超強手」能指導一下漁郎,達成此一心願呢 (已解決了,Ya ~~ 2010/06/21)?

以下逐一介紹該主畫面的各個功能與畫面說明:


(A) 廣告:‧‧‧漁郎也是不得已的 >_<,別打我‧‧,請不喜歡廣告的朋友不要下載這個程式。

(B)  GPS 定位資訊:有緯度、經度、定位設備 (gps 或 network)、高度、速度 (公尺/秒 與 公里/小時),當定位設備是 gps 時,才會出現『高度』與『速度』的資訊,且 gps 定位代表著精準定位,但因為 gps 是接收得到衛星訊號才有作用,因此只能在室外接收得到衛星訊號的地方使用,且使用 gps 會比較耗電,建議使用者如果是常要進出室內室外,或使用定時發訊的功能時,開啟行動網路定位即可,雖然,行動網路定位(A-GPS/Network)精準度較差,誤差會達幾公尺甚至幾公里遠之普,但會比較省電且不大用擔心接收不到衛星訊號的問題。

(C) 定位所在地址:經測試,如移動速度過快時,由於解析定位地址過於頻繁,會造成定位地圖本身會有嚴重滯延的情況,因此,本程式會在時速低於或等於 70 公里時才顯示定位地址。

(D) 即時定位地圖:中心點的圓形淺藍標記是定位點,而該定位點外圍的透明淺藍圓圈則是因定位精準度不同而會出現不同大小的同心圓,該同心圓代表著約當的定位所在點分佈範圍。通常,gps 定位只會出現中心點,而使用 WiFi 或行動網路定位,則外圍圓圈會大許多。

(E) SOS 緊急求救訊號發送:只要點選該圖示,程式會出現求救發訊選單,並馬上依您的選擇,以及以收訊者(聯絡人)資料中有勾選『求救發訊』,而且有勾選『郵件發送』或『簡訊發送』者,分別發出電子郵件或簡訊之求救訊息(含定位資訊)給收訊者。



(2) 功能選單:設定相關參數、資料與定時功能開關等功能選擇

按下手機上的 MENU 按鈕後,會出現功能選單,讓您設定好發訊者(Sender)參數,收訊者(Receiver)資料與開啟或關閉定時發訊(Switch)。


(A) Sender (發訊者參數):


請在這裡面輸入您正確且完整的 Gmail 郵件地址與 Gmail 的正確登入密碼,這些參數主要是使用在發送電子郵件時使用,且這些參數只儲存在您的手機中,當本程式被移除或重新安裝時,這些參數亦會被刪除,請您安心使用。


(B) Receiver (收訊者資料):


當您點選表單列表的個別資料時,會出現如下的選項,讓您選擇是要修改該筆資料還是刪除該筆資料。如您點選『收訊者資料刪除』,則該筆資料馬上會被刪除;如您點選『收訊者資料修改』,則會進入資料修改畫面。而當您按下手機上的 MENU 鈕,跳出功能選單,且點選『新增』時,則會進入新增收訊者資料的畫面。



在此要特別說明的是:

(a) 求救訊息發送:當有勾選『求救發訊』與『郵件發送』時,在主畫面按下 sos 圖示,程式就會對該名收訊者發出包含『求救訊息』內容的求救定位電子郵件;而當有勾選『求救發訊』與『簡訊發送』時,在主畫面按下 sos 圖示,程式就會對該名收訊者發出包含『求救訊息』內容的求救定位簡訊。

(b) 定時訊息發送:當有勾選『郵件發送』或『簡訊發送』時,如『定時發訊開關』是在 ON 的情況下,會以定時發訊設定的循環時間分別發送電子郵件或簡訊給該名收訊者。


(C) Switch (定時發訊開關):


當點選【OFF - Touch to ON】時,該圖示會變成【ON - Touch to OFF】,程式會馬上執行一次發訊作業,並依所設定的循環時間進入定時循環發送程序,除非再點選一次【ON - Touch to OFF】,否則,就算退出『求救發訊器』程式或手機已進入『休眠省電』狀態,還是會自動發送定位訊息給收訊者,此時,若使用者設定的收訊者有勾選『簡訊發送』,那代誌就大條了,月底的電信帳單會有一筆可觀的簡訊費用,請小心使用自動發訊功能。

啟動『自動發訊』後,程式自動發訊的時間範例:

如現在時間是 13:24 ,循環時間是 5 分:
(1) 12:24 第一次發訊 (剛啟動)
(2) 12:35 第二次發訊
(3) 13:40 第三次發訊




(3) 顯示定位點的地圖:


(A) 如收訊者收到是求救或定時發送的簡訊,由於簡訊有 70 個字的限制,因此您一次會收到兩封簡訊 (測試簡訊只會收到一封),一封的內容是文字資訊,另一封內容則是經緯度資訊。您需使用可有網頁瀏覽器的平台上,例如:電腦、PDA,進入 http://www.e68club.com/p/google-maps.html,並輸入簡訊的經緯度資訊,取得定位點的地圖顯示。


(B) 如收訊者收到是求救或定時發送的電子郵件,則只要在有支援 JavaScript 之網頁瀏覽器的平台上,例如:電腦、PDA ,打開郵件內容,依需要點選不同尺寸的超連結即可顯示定位點的地圖。



(4) 使用情境範例:


(A) 深山求援:當在深山野外遇到危險時,自身有 Android 手機時,使用本軟體,可在打電話求援的同時,亦以 GPS 精確的定位資訊讓救援人員可以 Web Google Maps 知道自己的所在位置。此時,記得要開啟 GPS,並在衛星訊號收得到的地方,以主畫面上的定位地圖確認所在位置已定位無誤 (雖然不知身在何處,但須確定 GPS 是定位成功的),然後點選 SOS 圖示發出求救定位訊息給收訊者資料中的親朋好友們。

(B) 家人照護:使用定時發訊功能,協助家人對小朋友或失智老人的所在位置觀護。您可先幫小朋友的 Android 手機下載與安裝本程式後,做好相關設定參數與資料,並開啟『自動發訊』功能。然後將該設定好的 Android 手機交給小朋友隨身攜帶。此時最好是僅開啟『行動網路』定位功能,但不開啟 GPS,因你無法確定發訊者的手機能否在衛星訊號收得到的地方。還有!記得小朋友回到家後,您要記得去關掉『自動發訊』功能 (漁郎在下個版本會加入『依設定時間』自動定時開關『自動發訊』的功能)。不然,如是以簡訊發送,月底帳單會嚇昏人的。最保險的辦法,是僅勾選收訊人資料中的『郵件發送』,而不勾選『簡訊發送』,才會讓人心驚膽顫 >_< ‧‧‧

(C) 其他應用:您有其它的情境範例嗎?歡迎您回應分享喔 ^__^ !

(D) 番外篇中文暱稱存取亂碼問題 (已解,詳見回應內文)

附錄: 會造成中文亂碼的設定存取程式 @@


    // 檢查設定檔是否存在並取出設定檔內的值 -- 注意 : 程式重新安裝時, 原設定檔會被刪除
    private void checkFile() {
        boolean isExit = true;
       
        FileOutputStream fos = null;
       
        try {
            openFileInput(HelpMeSOS.fileName); // 設定檔已存在, 則開啟設定檔 .....
        } catch (FileNotFoundException e) {
            isExit = false; // 設定檔未已存在, 則傳回 false 值
        }
       
        if (!isExit) { // 如設定檔不存在, 則建立初始設定檔
            try {
                fos = openFileOutput(HelpMeSOS.fileName, MODE_WORLD_WRITEABLE);
                BufferedOutputStream bos = new BufferedOutputStream(fos);

               
                String txt = "";
               
                // 發信者的匿稱
                sender_nick = "";
                txt = HelpMeSOS.sender_nick_key + "=" + sender_nick;
                bos.write(txt.getBytes());

               
                // 發信者的郵件帳號
                email_address = "";
                bos.write(new String("\n").getBytes());
                txt = HelpMeSOS.email_address_key + "=" + email_address;
                bos.write(txt.getBytes());
               
                // 發信者的郵件密碼
                email_password = "";
                bos.write(new String("\n").getBytes());
                txt = HelpMeSOS.email_password_key + "=" + email_password;
                bos.write(txt.getBytes());
               
                bos.close();
                fos.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
       
        // 將設定檔內的值取出
        Properties p = new Properties();
        try {
            p.load(openFileInput(HelpMeSOS.fileName));
            sender_nick = p.getProperty(HelpMeSOS.sender_nick_key);
            email_address = p.getProperty(HelpMeSOS.email_address_key);
            email_password = p.getProperty(HelpMeSOS.email_password_key);
           
            // 將設定檔取出的設定值填入資源中
            SenderNickEditText.setText(sender_nick);
            SenderEmailAddressEditText.setText(email_address);
            SenderEmailPasswordEditText.setText(email_password);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

14 則留言:

  1. 來個自問自答 : 如何解決 Android 寫入檔案 (設定檔) 中文會亂碼的問題?

    原來阿,Android 內定寫入檔案的編碼是 8859_1 ,所以,將程式改寫成下面這樣就好了:



    // 檢查設定檔是否存在並取出設定檔內的值 -- 注意 : 程式重新安裝時, 原設定檔會被刪除
    private void checkFile() {
    boolean isExit = true;

    try {
    openFileInput(HelpMeSOS.fileName); // 設定檔已存在, 則開啟設定檔 .....
    } catch (FileNotFoundException e) {
    isExit = false; // 設定檔未已存在, 則傳回 false 值
    }

    if (!isExit) { // 如設定檔不存在, 則建立初始設定檔
    saveData(0);
    }

    // 將設定檔內的值取出
    Properties p = new Properties();
    try {
    p.load(openFileInput(HelpMeSOS.fileName));

    // 讀取檔案 ( 內定內碼為 8859_1 , 將之轉成 UTF-8 )
    sender_nick = new String(p.getProperty(HelpMeSOS.sender_nick_key).getBytes("8859_1"),"UTF-8");
    email_address = new String(p.getProperty(HelpMeSOS.email_address_key).getBytes("8859_1"),"UTF-8");
    email_password = new String(p.getProperty(HelpMeSOS.email_password_key).getBytes("8859_1"),"UTF-8");

    // 將設定檔取出的設定值填入資源中
    SenderNickEditText.setText(sender_nick);
    SenderEmailAddressEditText.setText(email_address);
    SenderEmailPasswordEditText.setText(email_password);
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    // 設定資料儲存
    private void saveData(int flag) {
    FileOutputStream fos;
    try {
    fos = openFileOutput(HelpMeSOS.fileName,MODE_WORLD_WRITEABLE);

    String txt = "";

    if(flag == 0) {
    // 新檔案
    sender_nick = "";
    email_address = "";
    email_password = "";
    } else {
    // 發信者的匿稱
    sender_nick = SenderNickEditText.getText().toString();

    // 發信者的郵件帳號
    email_address = SenderEmailAddressEditText.getText().toString();

    // 發信者的郵件密碼
    email_password = SenderEmailPasswordEditText.getText().toString();
    }

    txt = HelpMeSOS.sender_nick_key + "=" + sender_nick+"\n"+
    HelpMeSOS.email_address_key + "=" + email_address+"\n"+
    HelpMeSOS.email_password_key + "=" + email_password;
    fos.write(txt.getBytes()); // 寫入檔案 ( 內定內碼為 8859_1 )

    fos.close(); // 關閉檔案
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    回覆刪除
  2. 感謝 square.chen 的鼎力幫忙, 測試『求救發訊器』在 Moto Droid 上的運作情形.

    http://www.mobile01.com/topicdetail.php?f=423&t=1529574&p=1

    回覆刪除
  3. 感謝 square.chen 與 ryankou 的幫忙, 經漁郎不斷的分析 Logs, 終於 ..... 抓到 SMS 大烏龜了 @@ ....

    原來... 在中文介面發 SMS 沒問題, 但切到英文介面後, 發覺原來是雙位元亂碼問題, 由於程式內定的的英文訊息中, 有雙位元的符號, 也就是以下幾個左邊的字元 @@ , 經實地到中華電信的簡訊發送網站測試, 當簡訊中只要有 1 個雙位元碼的字時, 電信商的系統會將整個簡訊長度判定僅能 70 個字, 因此 SMS 才會因此被電信商退回而出現 SMS Fail :

    ! -> !
    : -> :
    , -> ,
    。 -> .
    、 -> .

    經修正後, 還發覺 Google Maps API 解析出的英文地址有時也會夾雜一些雙位元中文亂碼 @@ .....

    漁郎在英文介面環境測試, 如發出一串純英文內容的 SMS 訊息則無誤, 可發送成功, 但如夾入 Google Maps API 解析出的英文地址時, 有時可以, 有時不行, 原來是有些 Google Maps API 解析出的英文地址沒夾雜雙位元中文亂碼, 有些會夾雜雙位元中文亂碼 .... @@ 天......

    漁郎已將修正過的程式上載到 Android Market, 並且已解決 Margaret 的問題.

    其實如沒 square.chen 的提醒, 改用 +886xxxxxxxx , 可能除了原來查不出原因的中文亂碼問題外, 會再次被 Margaret 退件 @@ ......

    漁郎也修正了部份程式碼, 避免因在室內開啟 GPS 或根本沒連上網所造成的異常關閉問題 (但在室內開啟 GPS , 會因 GPS 沒接收到衛星訊號而無法重新定位, 因此定位會先抓到 GPS 舊的定位地址 @@).

    修正: 打密碼的時候會出現您所鍵入的號碼顯示一秒,隨之馬上變成隱藏碼.

    再次感謝 square.chen 與 ryankou 的幫忙 !

    回覆刪除
  4. 您好.. 我的機器是 Archos 5IT
    是 1.6版的 OS
    不知為何在 Market 中,找不到您的軟體...
    可否協助呢!? 謝謝!!

    回覆刪除
  5. 派謝喔, 現在才回應, 因剛帶全家去旅遊回來.
    1.6 的 Android 應該找得到『求救發訊器』的, 不知是不是 Android Market 的索引又出問題了, 可否請您在 Android Market 上手動搜尋『求救發訊器』或『com.e68club.android.HelpMeSOS』試試?再不行咱在重新上載試試.

    回覆刪除
  6. xt701 rooted 定位完成就異常終止了

    回覆刪除
  7. 謝謝您的告知, 漁郎現在也正一個頭兩個頭大之中... 因為手邊沒 XT701 這熱呼呼的機子, 而手邊的 Hero (2.1) 測了又沒啥問題, 平平是 android 2.1 , 怎會.... @@ , 好像還沒聽到 Droid 有啥狀況, 等會兒來問問美國的馬格莉特看看, 無地兄能否幫忙抓抓 XT701 的 error logs 給我呢?

    回覆刪除
  8. 神奇的是~~ 韓國的 XT720 居然沒啥問題 @@ ...

    回覆刪除
  9. 您好.. 我的機器是 samsung i9000
    是 2.1版的 OS
    不知為何在 Market 中,找不到您的軟體...
    可否協助呢!? 謝謝!!

    回覆刪除
  10. 您好! Rex,
    Samsung i9000 應可找到喔! 我猜八成又是 Android Market 的索引出了問題 @@
    剛剛漁郎重新上載程式, 請您試試尋找『求救發信器』或『Help Me! SOS』或『com.e68club.android.HelpMeSOS』或『e68club』試試.
    還有,請記得開啟網路定位(室內)或GPS(室外)功能,並循以下步驟設定與使用程式: (1)發訊者(Sender) (2)收訊者(Recipient) (3) SOS , 另外, 該程式點選 MENU 會有更多功能與說明 ^_^
    如使用上有問題或在 i9000 上是否可使用, 可否也告知漁郎知曉 ? 因 Android 手機實在太多種了 @@ , 漁郎沒那麼多錢錢都買來測試, 只能靠各位夥伴們了 >_< , 先謝啦 !

    回覆刪除
  11. 請問有比較簡單的範例可以解說電子羅盤ㄇ 因為要做在室內的導引方向系統

    回覆刪除
    回覆
    1. 試試參考參考以下的文章與範例:

      http://www.e68club.com/2010/07/google-maps.html

      刪除
  12. 您好,請問是否可提供範例程式
    參考程式中GPS/A-GPS定位的寫法
    最近在研究有關這部分的定位
    信箱:qaz56740@gmail.com
    感謝><

    回覆刪除
    回覆
    1. K777,坊間目前已有許多關於 GPS 的程式範例書,建議您不妨先找找,再不然,以下文章中的範例應該可以符合您的需求 ^^ :

      http://www.e68club.com/2010/07/google-maps.html

      刪除