google内购In-App Billing

本帖地址: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里面添加

 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了~


你可能感兴趣的:(Android,Google,Google,Play,iab,内购)