Wednesday, August 24, 2011

判別使用者的裝置版本

有時候在寫code的時候,
會遇到有些舊的類別在新版已不推薦使用,
因為新版推出了更好的功能。

產品經理(PM)在此時又要求2種功能都存留,
這時候下面這個判斷就變得很好用了。

if (android.os.Build.VERSION.SDK_INT >= 8){
   //在Android 2.2以上要用什麼類別
  }else{
   //在2.2以下又要怎麼處理同一個需求
  )
 

Thursday, August 18, 2011

Test in-app purchase測試你的內部應用程式購買機制

在使用測試in-app purchase時,
有以下幾點需注意︰
1.官方強調︰測試in-app purchase(以下簡稱iap)請勿使用模擬器!
2.如果你要測試的是預保留產品ID(reserved product IDs),那就不需要使用測試帳號。如︰android.test.purchased這組預設ID是讓你拿來測試購買後會發生哪些回傳值。
3.確認你裝置上的Android Market版本是否適合運行iap


真實測試你的iap物品
1.需要在軟體發佈網站裡記錄一組測試帳號

2.上傳的apk不需要被發佈,但是iap內的物品必須被發佈!
注意︰Android Market上面這個未發佈的apk的版本編號以及簽章(Signature)需以裝置上的版本一致
3.購買時帳目會真實被記進tester的Google checkout裡,
之後user跟開發者提出退費請求(可能寄e-mail或什麼的),
開發者就可以在Google Checkout Merchant account使用退費機制(refund)。

此時Google checkout會寄出該user已經退費的訊息給Android Market,
Android Market再寄出訊息給user手上的應用程式。
如果你的應用程式當初有寫收到退費的訊息時要做什麼處置,
那麼程式就會在這個時候開始動作。
譬如︰沒收紅藥水、魔法藥水。


4.請用釋出版本的signature,而非debug的signature
5.將一臺裝置的帳號設成測試帳號

  1. Open Settings on your device.打開裝置裡的設定
  2. Touch Privacy.點擊隱私設定
  3. Touch Factory data reset.點擊重設為原廠設定
  4. Touch Reset phone.點擊重設手機按鈕
Note: The only way to change the primary account on a device is to do a factory reset, making sure you log on with your primary account first.
將測試帳號設為主帳號的唯一方式,就是使用重設為原廠設定。
這樣做才能確保你是用主帳號登入Android Market

========實測結果=========
1.當你真的去買了iap內的東西,測試帳號裡的Google Checkout裡會有消費記錄
2.若馬上移除掉apk,這筆iap消費記錄也會馬上被退款(未免也太迅速了吧⋯)
3.若你要重新購買時,Android Market的iap視窗會回應你︰系統正在處理您的訂單,稍候幾分鐘即可取得您的商品。

4.後來,過了40分鐘,才能又購買這筆iap的產品

Saturday, August 13, 2011

in-app purchase匯入步驟

以下文章從Billing Android- implementing in-app billing取材整理


1.將Billing Sample src裡的com.android.vending.billing複製到你的專案裡
2.在AndroidManifest.xml裡的user-permission添加
com.android.vending.BILLING
註︰如果沒有宣告就請求billing機制時,將會收到
RESULT_DEVELOPER_ERRO反應

3. 建立BroadcastReceiver和Service(見步驟4)

BroadcastReceiver - 用來處理從Android Market傳來的Billing訊息 
Service - 綁剛才從billing sample src複製過來的IMarketBillingService.aidl

哦!對了。AndroidManifest.xml裡的BroadcastReceiver要設 intent filters 

      
        
        
        
      
    
4.攢寫Service
這個Service將要做哪些事?
(1)綁定IMarketBillingService.aidl
(2)向Android Market發佈Billing請求
  • CHECK_BILLING_SUPPORTED requests
  • REQUEST_PURCHASE requests
  • GET_PURCHASE_INFORMATION requests
  • CONFIRM_NOTIFICATIONS requests
  • RESTORE_TRANSACTIONS requests
(3)同步處理以上這些請求的回應


============================
(1)綁定IMarketBillingService.aidl詳細說明
  1. 建立一個Service並實作serviceConnection,然後將底下的Code放進OnCreate()
  2. try {
      boolean bindResult = mContext.bindService(
        new Intent("com.android.vending.billing.MarketBillingService.BIND"), this,
        Context.BIND_AUTO_CREATE);
      if (bindResult) {
        Log.i(TAG, "Service bind successful.");
      } else {
        Log.e(TAG, "Could not bind to the MarketBillingService.");
      }
    } catch (SecurityException e) {
      Log.e(TAG, "Security exception: " + e);
    }
     
  3.  建立callback(將以下程式碼貼進自創的Service裡)
  4. /**
      * The Android system calls this when we are connected to the MarketBillingService.
      */
      public void onServiceConnected(ComponentName name, IBinder service) {
        Log.i(TAG, "MarketBillingService connected.");
        mService = IMarketBillingService.Stub.asInterface(service);
      }
     
  5.  可以開始用mService去 sendBillingRequest()任何需求了!
 記得將developer發佈頁面裡的公開金鑰放進Security.java裡的base64EncodedPublicKey變數中

    Monday, August 8, 2011

    台灣購買Android軟體

    由於臺北市政府跟Google因軟體7天退費乙事正面交鋒中,
    但是還是有很多網友很支持開發者,
    想花錢去購買軟體。

    CJAY部落客有教我們怎麼將自已虛擬成外國用戶來購買Android Market的軟體,
    有興趣的看一看吧!

    步驟應該不會太難才是!

    2011/08/13註︰
    Market Enabler雖然能讓USER購買付費軟體,

    1.裝置需要ROOT
    2.仍然不能支援IN-APP-PURCHASE

    實測後只有依照CJAY教的方式,
    才能實現在台灣使用in-app-purchase付費

    2011/08/25 11:00註︰
    現在又變成Market Enabler可以使用IN-APP-PURCHASE,
    而CJAY的則不行⋯

    2011/08/25 15:50註︰
    現在Market Enalber和CJ的vpn都能用IN-APP-PURCHASE了

    天啊,台北市政府,還我乾淨的測試空間!
    話又說回來,為什麼要在這個時間點要求我做IN-APP-PURCHASE
    (踢)

    Monday, August 1, 2011

    Android proguard issue - Can't read [proguard.ClassPathEntry@1a0c10f] (No such file or directory)

    If you encounter the problem that can't read something when you proguard your program
    as title write:
    java.io.IOException: Can't read [proguard.ClassPathEntry@1a0c10f] (No such file or directory)

    There will be two things you have to do:

    1.Download the newest ProGuard version from official website, unzip all its' file in sub-directory and replace to your-andoird-sdk\tools\proguard\

    It'll appear the exactly path where you got issue.

    2.Export project again,
    Now it'll show the error is:
    java.io.IOException: Can't read [/Users/simon/Android/?q?HSDK/FET_SMarket_SDK/FET_APP_Store_SDK_2.3.0.jar] (No such file or directory)

    3.When I back to that directory, ?q?HSDK isn't my directory's name, the name actually is "電信SDK".
    Now, I got the answer that I can't use Chinese in my path, Otherwise I will get this problem.

    原來讓我卡住一天,不能發佈並混淆程式的原因是︰
    我用了中文目錄成為路徑,
    ProGuard不能辨認中文!

    上一篇︰

    關於程式碼混淆proguard

    相關文章︰