3

我目前正在尝试将应用内结算添加到我的应用中,以便用户可以进行小额捐款。我使用最新版本的 Android Studio 进行开发,并遵循本指南(一步一步,我正在做所有提到的事情......至少我认为我这样做:-)):https ://developer.android.com /google/play/billing/billing_integrate.html

AIDL 文件放置在上述位置(在src/maincom.android.vending.billing 包中),我看到它是在gen文件夹下生成的。

当我测试产品检索时,我注意到该方法onServiceConnected从未被调用,它在活动中实现如下:

IInAppBillingService mService;

ServiceConnection mServiceConn = new ServiceConnection() {
   @Override
   public void onServiceDisconnected(ComponentName name) {
       mService = null;
   }

   @Override
   public void onServiceConnected(ComponentName name,
      IBinder service) {
       mService = IInAppBillingService.Stub.asInterface(service);
   }
};

与服务的绑定是这样的(在同一个活动中):

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_donation);
  Intent serviceIntent =
      new Intent("com.android.vending.billing.InAppBillingService.BIND");
  serviceIntent.setPackage("com.android.vending");
  bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);
}

我注意到两件事:

  • 当我离开捐赠活动时,我在控制台中看到一个异常:... has leaked ServiceConnection ... that was originally bound here- 我看到有些人建议在应用程序上下文中替换使用 bindService 而不是活动,实际上如果我这样做,问题就消失了。但我认为这与我onServiceConnected从未调用过的主要问题无关,而且为什么在官方指南中调用了该活动?
  • bindService返回一个布尔值,我检查了返回值,它是false。所以我想这就是问题的来源。

我看到有人说必须将服务的条目添加到 AndroidManifest.xml - 像这样:

试过这个,但没有任何区别,官方指南中也没有提到这个条目,所以我相信它是不需要的。

任何想法我做错了什么?

4

2 回答 2

10

实际上,我在此期间发现了什么是“错误的”。

根据官方测试应用内计费指南(https://developer.android.com/google/play/billing/billing_testing.html):

在 Android 设备上安装您的应用程序。

您不能使用模拟器测试应用内计费;您必须在设备上安装应用程序才能测试应用内计费。

不幸的是,此信息不在其他指南中,我通常首先在模拟器上测试所有内容。在将应用程序部署到真实设备并在那里进行测试后,很明显没有问题。

我现在包含一条消息,该消息在bindService返回false时出现,通知用户无法建立与服务的连接,以防真的存在连接问题,或者如果我在模拟器上测试功能看起来更好。

于 2016-10-04T08:54:13.967 回答
0

我像这个例子谷歌一样实现了应用内购买,如果你阅读它,你会在课堂上看到你的代码IabHelper(它为你实现了)。

https://github.com/googlesamples/android-play-billing/tree/master/TrivialDrive

于 2016-09-27T09:46:36.910 回答