本帖地址:http://blog.csdn.net/jinjian2009/article/details/9140891
這周做了google的內購,沒搞過google的內購還是覺得比較繁瑣的
google官方教程:http://developer.android.com/training/in-app-billing/index.html
這個教程主要寫了四節:
第一節:Preparing Your In-app Billing Application(準備你的內購應用)
內容如下:
1.下載例子程序,按照提示的做OK的,可以把項目trivialdrivesample配置到Eclipse裏看看
2.添加你的應用到開發者後臺。搞定之後會得到個Base64 Key,這個在代碼裏會用到,主要是用於google來識別你的應用
3.添加In-app Billing(後面簡稱iab)庫。其實就是IInAppBillingService.aidl 這個文件,從例子工程裏找到它,copy到自己工程下的src下的包com.android.vending.billing裏面,再把例子工程裏的src下的包com.example.android.trivialdrivesample.util下面的程序copy到自己工程的src下,自己創建個包名就好,本人偷懶直接用了它的包名
4.添加權限,AndroidManifest.xml裏面添加
<uses-permission android:name="com.android.vending.BILLING" />5.發起和google play的連接
在activity裏添加變量mHelper,以及初始化之,這裏的base64EncodedPublicKey需要賦值爲之前第2步申請到的base64 Key
IabHelper mHelper; @Override public void onCreate(Bundle savedInstanceState) { // ... String base64EncodedPublicKey; // compute your public key and store it in base64EncodedPublicKey mHelper = new IabHelper(this, base64EncodedPublicKey); }
然後需要調用mHelper的startSetup方法,這是個異步方法,主要是連接google play用的,看看能不能付費什麼的。我學習例子工程把這個方法寫到了OnCreate裏,在mHelper new出來之後。
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { public void onIabSetupFinished(IabResult result) { if (!result.isSuccess()) { // Oh noes, there was a problem. Log.d(TAG, "Problem setting up In-app Billing: " + result); } // Hooray, IAB is fully set up! } });然後還需要在Activity裏面將mHelper移除掉
public void onDestroy() { super.onDestroy(); if (mHelper != null) mHelper.dispose(); mHelper = null; }
PS:上面的代碼可以copy例子工程裏的,那裏面寫的可能全一點。
第二節:創建用於出售的iab商品1.在google play裏面添加iab商品。
1)這個是在後臺做的,需要說明的是,這裏需要添加APK文件,並且這個APK文件需要簽名,必須保證這個APK是你最終的APK,意思是簽名啊包名啊證書啊什麼的,後面都不改了。還有不要發佈該應用
2)添加商品的時候需要指定商品的信息,包括唯一標識ID,描述,價格等信息。唯一標識ID,也被稱爲SKU,通過SKU可以查詢商品的信息
3)上傳之後可能需要一段時間才能查詢到信息
2.查詢可購買物品
通過上面的SKU進行查詢,可參照原帖子代碼,或者例子工程代碼
添加代碼後可以運行APP,看能不能查詢到商品信息。需要注意如下幾點:
1)如果在google play裏面添加商品的話,現在查詢會出錯。
2)如果在國內(大陸地區)查詢也是會出錯的~解決辦法參考了帖子:http://zengrong.net/post/1801.htm
說下本人的解決辦法:
---------------------------------------------------------------國內IAB測試方法-------------------------------------------------------------------
<1>先去找個國外VPN,我在https://www.vcupmars.com註冊的,免費的20分鐘會斷,500M的流量~當然這網站也有沒有限制的,不過需要收費,記住賬號密碼,以及在我的帳戶裏面的域名地址
<2>然後在手機上打開wifi,再設置好VPN,主要是新建個VPN,服務器爲上面的域名地址,然後登陸VPN,賬號密碼爲上面網站註冊的賬號密碼
<3>再去卸載google play的更新,並清除數據(在 設置--》應用程序找到google play)
<4>再打開google play,進去看下,有沒有付費應用可以下載,如果有說明可以了
<5>進入自己的應用,看看能不能查詢到商品(如果不能的話,應該還是google play裏面的問題,可以退出應用再進google,然後再進應用。我發現一般等google play商店更新完之後會OK的)
--------------------------------------------------------------------------------------------------------------------------------------------------
第三節:購買應用內計費商品
看google官方教程,或者例子工程,應該都可以
不過本人做的時候,以爲出了點問題,主要是購買之後沒有消耗商品~什麼意思呢,google play上買東西是這樣子的,他是買了之後相當於放到了倉庫裏,這個時候你還要去消耗它變成你應用裏的東西~
如果沒有消費掉的話,就會出錯哦~
第四節:測試應用程序
這個也沒什麼說的,照着google官方帖子看看~
比較麻煩的是需要綁定信用卡~這個大家自己搜搜帖子吧~貌似開發者賬號不能用於測試,可以添加其他的賬號測試
PS:下面說說過程中遇到的其他比較棘手的問題:
1.如果在大陸地區,不使用VPN的話,點擊購買商品是會閃退的
主要的原因是第一節裏面IabHelper mHelper 調用startSetup方法的時候連接google play出錯,後面再調用的時候有些東西沒有設置好
解決辦法是通過mHelper的變量mSetupDone來判斷購買按鈕的事件是否觸發。當然源代碼裏的mSetupDone是私有的,可以將其設置爲public或者寫個調用方法
2.如果在大陸地區,不使用VPN的話,進入應用後,退出應用的時候會報應用發生意外
這個主要的原因是,在第一節裏面寫的在Activity的onDestroy方法裏面需要調用IabHelper mHelper 的dispose方法,而在dispose方法裏有這樣一句
if
(mContext != null) mContext.unbindService(mServiceConn);
這裏出錯了~雖然mContext mServiceConn都不爲空,但是因爲在大陸地區,所以在IabHelper mHelper 的startSetup方法裏沒有bindService
解決辦法,寫個變量boolean mBindedService = false;然後在startSetup方法裏bindService的時候賦值給mBindedService,代碼如下:
mBindedService
= mContext.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);
然後再dispose裏面加上mBindedService作爲判斷條件
if (mContext != null && mBindedService) mContext.unbindService(mServiceConn);
通過上面設置應該就OK了,還有一條是我自己的原因
3.因爲我對代碼做了一些特殊處理,然後呢發現居然找不到一個類了~
後來發現是斷言做的怪~Base64.java有個斷言assert (e == outBuff.length);
改成拋異常,OK了~