2011年12月15日 星期四

[Android] 備份SQLite資料庫到SD card

原本想寫個備份SQLite的教學文章,

不過下面這個網址,都直接貼完整程式碼給我們了!!


http://www.screaming-penguin.com/node/7749


Nice job!!

[Android]撰寫第一支Facebook應用關連程式 (一)

要做到與Facebook互動的Android程式,必須先做到以下幾件事情:

1.      下載並匯入Facebook Android API
(1)       下載位址請點我
(2)       下載回來後,解開壓縮(本例是facebook-facebook-android-sdk-50e4fd5.zip
(3)       打開Eclipse,匯入facebook Anroid API
File】→【New】→【Project】→【Android Project】→Create project from existing source→把路徑指向 ~\
facebook-facebook-android-sdk-5d44d0c\facebook
(4)       新專案可在【Project】→【Properties】→【Android】→【Library】→透過 Add 新增 com_facebook_android
(5)       可參考此網頁:點我

2.      取得KeyTool產生的AP金鑰
(1)       可參考此篇教學:用eclipse發佈android的apk
(2)       keytool -genkey -v -keystore XXX.store -alias XXX.keystore -keyalg RSA -validity 20000
其中-genkey是產生key-v顯示詳細資訊 -keystore android.store是名稱,-alias android.keystore是別名、-keyalg RSA 是加密方式為RSA-validity 20000是有效期限,在Android Market上要求是至少50(18250)

3.      取得KeyStore後,接下來要做Hash KeyStore取得等下要放進Facebook應用程式的Hash key
(1)       下載 Openssl.exe at  http://gnuwin32.sourceforge.net/packages/openssl.htm
(2)       cmd將目錄指向上一個步驟取得的XXX.keystore
(3)       打上
keytool -exportcert -alias XXXXkey -keystore XXX.keystore | openssl sha1 -binary | openssl base64
(4)       Cmd會顯示Hash後的值,這裡假設是 123456

4.      Facebook申請一個應用程式
(1)       進入 https://developers.facebook.com/apps

(2)       直接用下圖說明,
App
顯示名稱: 打上你要顯示在facebookAP名稱,不用跟Android的程式名稱一樣。
選擇Native Android App,在Android Key Hash 打入上一個步驟取得的Hash key值。

(3)       設定完成後,Facebook會提供一組 App ID 給我們,這一組ID會用在你的Android程式裡面。


接下來,讓我們開始寫一支可以POST文字訊息或圖片到Facebook塗鴉牆上的Android AP!

2011年11月29日 星期二

[Android] 振動(Vibrator)

Step1. 若要在應用程式內使用到震動這個服務,需先在AndroidManifest.xml允許存取android.permission.VIBRATE這個權限。

<uses-permission android:name="android.permission.VIBRATE" />


Step2. 程式碼


//取得震動服務
Vibrator vibrator = (Vibrator) getApplication().getSystemService(Service.VIBRATOR_SERVICE);

//震動3秒
vibrator.vibrate(3000);





2011年11月28日 星期一

[Android] 智慧型簡訊機器人管家 v1.8發佈




Smart SMS robot (智慧型簡訊機器人管家) 是可以預約發送簡訊的小管家應用程式。 如果你經常忘記送一封生日簡訊給你的朋友或是問候簡訊給自己的家人,馬上就下載Smart SMS robot到你的手機,隨時隨地自動發送簡訊,維繫與其它人的感情!
另附加的簡訊管理功能,可以儲存簡訊後加密,避免隱私簡訊被瀏覽。
也可以隨時備份/還原[智慧型簡訊機器人管家]的資料!
更多細節/操作說明:
http://karatejb.blogspot.com/2011/11/android_28.html


最近的更新:

2011/11/28 v1.8
1.新增自動發送簡訊通知(可選擇開啟/關閉)。
2.新增自動發送簡訊時,手機會振動兩秒提醒使用者。
*注意:請再更新[Smart SMS robot]前,先開啟應用程式備份您的資料,更新後再還原,避免資料遺失,謝謝~

2011/11/16 v1.7
1.解決一些顯示上的問題。

2011/11/13 v1.6
1. 解決無法在睡眠模式自動發送簡訊的臭蟲。
2011/11/03 v1.5
1.可切換中文/英文介面。







[Android] 智慧型簡訊機器人管家:使用手冊 (中文版)

智慧型簡訊機器人管家:使用手冊  2011/11/28 
(The FORCE studio present)

1.          主選單介紹

碰觸手機上的畫面,即進入主選單。



  
(1)       簡訊預約 :
此功能為建立/修改【簡訊預約】。
【簡訊預約】為預先設定時間和簡訊內容,該簡訊會自動在設定的時間發送出去。

(2)       簡訊管理
當您收到一封簡訊後,Smart SMS robot》會自動啟動。
您可以選擇儲存收到的簡訊,該簡訊會加密儲存在手機裡。 利用『鎖定』或『解鎖』功能來限制簡訊內容曝光。

(3)       備份/還原 :
可選擇匯出/匯入你在Smart SMS robot的所有資料。
(4)       使用手冊 :
學習如何使用 Smart SMS robot
(5)       Language/語言:
可選擇系統顯示的語系(英文/中文繁體)

2.          在《Smart SMS robot》傳送簡訊是免費的嗎?
Smart SMS robot》並不是一個網路服務,而是藉由您的電信業者的通訊協定作發送。在台灣,簡訊的發送需要額外的費用,費用的數目端看您的電信業者費率

3.          如何建立一個【簡訊預約】?


(1)       選取『電話簿』→『選擇』,選取你要寄送簡訊的連絡人。



(2)       選取『日期時間』,設定要發送簡訊的日期和時間。





(3)       編輯簡訊內容
首先我們必須建立「我的簡訊」,
「我的簡訊」可存放多個儲存過的簡訊,使用時只要從『我的簡訊」』選擇即可。




(4)       最後儲存【簡訊預約】
在『儲存』功能裡面,檢查剛才我們的設定,並可選擇【傳送地理位置?】在你的簡訊後面附加上您目前的GPS位置 GPS必須開啟)。 或【回傳紀錄?】傳送一份簡訊紀錄給自己。




(5)       儲存後,新的簡訊預約會出現在 預約紀錄


4.          如何查看以前儲存的 【簡訊預約】?
請到預約紀錄,所有預約的紀錄將會顯示在這邊。




5.          如何修改已儲存的簡訊預約】設定?
預約紀錄】中,點選任一簡訊預約,會出現對話窗,使用者可選擇更新
重新設定後,請回到儲存】功能,選取『更新』。
   


6.          如何刪除已儲存的簡訊預約?
如同 5.  但在對話窗中選擇刪除



7.          如何確認預約的簡訊是否正確發送?
Smart SMS robot》有時候因為服務停止、系統衝突等原因,會影響簡訊的發送。 如果要確認預約的簡訊是否有正確發送,有兩種方法。
(1)       預約紀錄】中,查看 Last time send這個欄位值是否有更新。
(2)       或利用回傳紀錄』功能,來進行確認。(請參考 6.)
(3)    可開啟選項中發送通知』功能,當系統自動發簡訊時,會顯示通知在手機的狀態列。

8.          設定中的使用者額外設定


         (1)       開機啟動服務 on/off : 
         勾選此選項,Smart SMS robot》的服務會在手機開機後,立即進行背景服務。 如果您想要手動啟動服務,請關閉此選項。
備註一:打開《Smart SMS robot》,服務也會自動啟動。
備註二:如果《Smart SMS robot》的服務沒有啟動,預約的簡訊將不會自動發送
(2)       發送通知 on/off:
此選項開啟後,會在自動發送一封簡訊後,顯示資訊在手機上的狀態列。
(3)       回傳紀錄 on/off:
建立簡訊預約】時可選擇該筆簡訊是否要回傳紀錄。
但在【設定】中,如果關閉這個選項,則所有單筆需回傳紀錄的【簡訊預約】都不會另外回傳紀錄。 所以當你不想再收到任何回傳紀錄時,可到【設定】關閉這個選項,而不用對每一筆【簡訊預約】作修改。

(4)       傳送地理位置 on/off:
建立簡訊預約】時可選擇該筆簡訊是否要夾帶你目前的GPS位置(GPS必須開啟)。
但在【設定】中,如果關閉這個選項,則所有【簡訊預約】都不會傳送地理位置。 所以當你不想再傳送自己的位置時,可到【設定】關閉這個選項,而不用對每一筆【簡訊預約】作修改。


9.          如何防止儲存的簡訊被其它人瀏覽?
簡訊管理】頁面中,點選『鎖定』並輸入你的密碼。
確定後,所有在《Smart SMS robot》儲存的簡訊在瀏覽時,都會是加密的文字。

    

   

『解鎖』功能,輸入你的密碼將你的簡訊解密!



10.      如何備份/還原我的Smart SMS robot》資料?



(1)       備份
進入備份與還原】,點選『備份』,所有資料會匯出到你的SD卡。
預設匯出路徑:「sdcard\Smart SMS robot\SMART_SMS_ROBOT.db
備註一:必須有SD卡才能進行備份/還原。
備註二:請注意! 每一次備份都將覆蓋上一次的備份資料庫。
  

(2)       還原
當你先前備份了一份資料在SD卡,可使用還原』功能,將資料還原。


如果您有使用上的任何疑問和建議,或是發現BUG和錯誤,

請告知我們!
可以在這裡留下您的留言或是寫Email給我們。
謝謝您!


The FORCE

[Android] Smart SMS robot

Smart SMS Robot v1.5 Released

Guide: WIKI  

   
  

2011年11月25日 星期五

[C#] 使用系統預設的應用程式來開啟對應的檔案資源 (轉貼)

相當詳細的文章唷!!

http://www.dotblogs.com.tw/atowngit/archive/2009/12/26/12678.aspx

1. 使用系統預設的瀏覽器開啟網頁


2.指定使用 IE 開啟網頁


3.使用預設的應用程式開啟文件檔


4.使用預設應用程式開啟 Word

2011年11月15日 星期二

[C#] Delegate Event (2)

Delegate Event

上次的目標:
實務上遇到需要計算每家廠商的交易手續費,但是每家廠商計算手續費的方法不同,所以利用Delegate event去指定各家廠商的交易手續費算法(Method)。

這次的目標:
每家廠商下面有多家特店,廠商的手續費是以這些特店的交易筆數(或金額)來計算手續費。
當特店的交易筆數(或金額)有異動時,必須重新計算手續費。

延續上次的專案內容..
一、                Windows Form專案來作範例
1.          專案內容:
2.          Merchant\IMerchant.cs … 廠商Interface
Merchant\CMerchant.cs ...
廠商Class
Store\IStore.cs ...
特店Interface
Store\CStore.cs ...
特店Class
CalFeeMethod.cs ...
手續費計算方法
Form1.cs
3.          執行畫面



二、                這次我們先來看看特店的部分
IStore.cs
1.          程式碼
public interface IStore
       {
        //對應廠商
        CMerchant Merchant { get; set; }
        //特店代號
        String Store_No { get; set; }
        //交易筆數
        double Trans_Cnt { get; set; }
        //交易金額
        double Trans_Amt { get; set; }
       }
2.           比較特別的地方是加入一個CMerchant物件,可以指定某家特店屬於哪家廠商。

三、                CStore.cs
1.          因為要作到「當特店的交易筆數(或金額)有異動時,必須重新計算手續費」這些事情,所以在CStore.cs我們在set Trans_Cnt/ Trans_Amt 時,必須多作一些判斷。
2.          程式碼
public class CStore
    {
        CMerchant cMerchant;  //對應特約機構
        String sStore_No; //特店代號
        double sTrans_Cnt=0; //交易筆數
        double sTrans_Amt=0; //交易金額

         /* 建構子 */
        public CStore(String s_no)
        {
            sStore_No = s_no;
        }
        /* Merchant */
        public CMerchant Merchant
        {
            get
            {
                return cMerchant;
            }
            set
            {
                cMerchant = value;
            }
        }
        /* Store_No */
        public String Store_No
        {
            get
            {
                return sStore_No;
            }
            set
            {
                sStore_No=value;
            }
        }
        /* Trans_Cnt */
        public double Trans_Cnt
        {
            get
            {
                return sTrans_Cnt;
            }
            set
            {
                /*******************************************
                 * 當符合以下情況時,重新統計手續費...
                 * 1. 筆數改變
                 * 2. 原筆數不為0 (表示非第一次設定筆數)
                 * 3. 已指定特約機構 (才知道手續費算法)
                 *******************************************/
                if (sTrans_Cnt != value && sTrans_Cnt != 0 && cMerchant != null) //筆數改變時
                {
                    sTrans_Cnt = value;
                    cMerchant.Print_Fee();
                }
                else sTrans_Cnt=value;
            }
        }
        /* Trans_Amt */
        public double Trans_Amt
        {
            get
            {
                return sTrans_Amt;
            }
            set
            {
                /*******************************************
                 * 當符合以下情況時,重新統計手續費...
                 * 1. 金額改變
                 * 2. 原金額不為0 (表示非第一次設定金額)
                 * 3. 已指定特約機構 (才知道手續費算法)
                 *******************************************/
                if (sTrans_Amt != value && sTrans_Amt !=0 && cMerchant != null) //金額改變時
                {
                    sTrans_Amt = value;
                    cMerchant.Print_Fee();
                }
               else sTrans_Amt = value;
            }
        }
    }
3.          對,沒錯。 我們在筆數(或金額)改變時,偷偷作了一件事情,就是跟廠商說你必須重新計算ㄧ次手續費:cMerchant.Print_Fee()
4.          那廠商怎麼知道所有它底下特店的交易筆數和金額呢? 所以Merchant介面/類別需加上一點東西。
四、                IMerchant.cs
1.          程式碼

       public delegate void CalFeeHandler(double dFee_Pt, double dNum);
       public delegate void CalFeeHandler(double dFee_Pt, double dCnt, double dAmt);


       public interface IMerchant
       {
        //特約機構代號
        String Merchant_No {get; set; }
        //底下所有特店
        List<CStore> StoreList { get; set; }
        //手續費
        double Fee_Pt { get; set;  }
        //計算手續費的事件
        event CalFeeHandler CalFee;
       }

2.          灰底的部分就是這次新增的程式碼
將計算手續費的delegate,傳入值分成三個:
 
dFee_Pt (手續費趴數)dCnt (筆數) dAmt(金額)
新增一個List<CStore>物件,可以紀錄在這家廠商底下的所有特店(CStore

 
五、                CMerchant.cs
1.          至於廠商類別的部分,也是作ㄧ些調整,故指列出調整的程式碼。
get/set 特店 以及 觸發計算手續費的方法 (灰字的程式碼為修改前的程式碼)
2.          程式碼
public class CMerchant : IMerchant
    {
        List<CStore> lStoreList;


        /* StoreList */
        public List<CStore> StoreList
        {
            get
            {
                return this.lStoreList;
            }
            set
            {
                this.lStoreList = value;
            }
        }


        /* 觸發CalFee這個Event */
        public void Print_Fee(double dNum)
        {
            if (CalFee == null)  //未指定手續費時...
            {
                Console.WriteLine("未指定手續費計算事件!");
            }
            else  // CalFee 這個delegate event計算手續費
            {
                CalFee(dFee_Pt, dNum);
            }
        }
/* 觸發CalFee這個Event */
        public void Print_Fee()
        {
            if (CalFee == null//未指定手續費時...
            {
                Console.WriteLine("未指定手續費計算事件!");
            }
            else  // CalFee 這個delegate event計算手續費
            {
                if (StoreList != null)
                {
                    double dCntSum = 0;
                    double dAmtSum = 0;
                    foreach (CStore myStore in StoreList)
                    {
                        dCntSum += myStore.Trans_Cnt;
                        dAmtSum += myStore.Trans_Amt;
                    }
                    CalFee(dFee_Pt, dCntSum, dAmtSum);
                }
            }
        }

    }

3.          程式這樣一對照,應該馬上就看出差別了。 之前我們是傳入一個交易筆數或金額讓Print_Fee() 觸發計算手續費事件(CalFee) 這一次我們不傳入任何值,而是讓這家廠商自己去統計它底下所有特店的交易筆數和金額,再傳給delegate event(CalFee)計算手續費。

六、                CalFeeMethod.cs
1.          實作delegate event的手續費演算法沒有更動,只是配合delegate event的傳入參數變成三個:
        /* 手續費 = 交易筆數*手續費趴數 */
        public static void CalFee_by_TransCnt(double dFee_Pt, double dCnt, double dAmt)
        /* 手續費 = 交易金額*手續費趴數/100 */
        public static void CalFee_by_TransAmt(double dFee_Pt, double dCnt, double dAmt)


七、                Form1.cs
1.          接下來就是直接拿來用了,底下用一個ListBox放三家廠商的代號,當按下「算手續費」按鈕時,就會計算各家廠商的手續費。




2.          就不多作解說了流程大致如下
a.
建立廠商(CMerchant)
b.
建立多家特店(CStore),並指定上層廠商。
c.
上層廠商加入這些特店
d.
廠商作第一次統計手續費
e.
當某廠商下任一家特店筆數/金額改變時,會重新統計該廠商的手續費。

3.          程式碼
private void bt_CalFee_Click(object sender, EventArgs e)
        {
            int MerchantCnt = lb_Mno.Items.Count;
            CMerchant[] MerchantSet = new CMerchant[MerchantCnt ];

            for (int index = 0; index < MerchantCnt; index++)
            {
                String sM_NO = lb_Mno.Items[index].ToString();

                MerchantSet[index] = new CMerchant(sM_NO);
                Console.WriteLine("特約機構代號:" + MerchantSet[index].Merchant_No);

                List<CStore> myStores = new List<CStore>(0);

                CStore storeA = new CStore("A");
                storeA.Merchant = MerchantSet[index];
                storeA.Trans_Cnt=10;
                storeA.Trans_Amt = 100;

                CStore storeB = new CStore("B");
                storeB.Merchant = MerchantSet[index];
                storeB.Trans_Cnt=20;
                storeB.Trans_Amt = 200;

                myStores.Add(storeA);
                myStores.Add(storeB);

                MerchantSet[index].StoreList = myStores;
               
                switch (sM_NO)
                {
                    case "123456":
                        MerchantSet[index].Fee_Pt = 0.8;
                        MerchantSet[index].CalFee += CalFeeMethod.CalFee_by_TransCnt;
                        break;
                    case "888888":
                        MerchantSet[index].Fee_Pt = 0.5;
                        MerchantSet[index].CalFee += CalFeeMethod.CalFee_by_TransAmt;
                        break;
                    default:
                        MerchantSet[index].Fee_Pt = 0;
                        break;
                }

                //列印手續費
               MerchantSet[index].Print_Fee();

                //改變storeA的筆數和金額
                //storeA.Trans_Cnt = 30;
                storeA.Trans_Amt = 100;

                Console.WriteLine("");
            }

        }

八、                執行結果
特約機構代號:123456
手續費 = 交易筆數*手續費%=24
手續費 = 交易筆數*手續費%=40

特約機構代號:888888
手續費 = 交易金額*手續費%/1001.5
手續費 = 交易金額*手續費%/1001.5

特約機構代號:333333
未指定手續費計算事件!
未指定手續費計算事件!