Android 在Codename One模拟器中测试应用内购买导致空指针异常

Android 在Codename One模拟器中测试应用内购买导致空指针异常,android,in-app-purchase,codenameone,Android,In App Purchase,Codenameone,我没有创建一个light和我的应用程序的完整版本,而是决定采用freemium方式,提供一个从light升级到完整版本的按钮 该应用程序仅在Google Play商店中可用。因此,我在Play Store中创建了一个应用内购买,如前所述 以下是我实现的代码: if (buyFull) { if (ParametresGeneraux.getPurchase().isManagedPaymentSupported()) { Stri

我没有创建一个light和我的应用程序的完整版本,而是决定采用freemium方式,提供一个从light升级到完整版本的按钮

该应用程序仅在Google Play商店中可用。因此,我在Play Store中创建了一个应用内购买,如前所述

以下是我实现的代码:

if (buyFull) {

              if (ParametresGeneraux.getPurchase().isManagedPaymentSupported()) {
                  String[] skus = {"ParametresGeneraux.getFullVersionSKU()"};

                   if (ParametresGeneraux.getPurchase().isItemListingSupported()) {
                     Product[] products = ParametresGeneraux.getPurchase().getProducts(skus);
                     String items = "";

                     if (products != null) {
                       for (Product p : products) {
                          items += p.getDescription();
                       }
                     }

                     Dialog.show("Produits intégrés", "Les produits intégrés sont " + items,
                                                         "OK", "Cancel");
                 }

                 // On achète
                 ParametresGeneraux.getPurchase().purchase("ParametresGeneraux.getFullVersionSKU()");
           } else {
                   Dialog.show("Évolution impossible", "Impossible d'évoluer vers la version complète. Votre compte n'a pas été débité.", "OK", "Compris");
                  }
其中
参数generaux.getPurchase()
正在执行
Purchase.getInAppPurchase()

当我使用Android皮肤(Nexus 5)在模拟器上测试它时,列表没有显示,并且在执行购买后总是导致空指针异常:

java.lang.NullPointerException
at com.codename1.impl.javase.JavaSEPort$82$5$1.run(JavaSEPort.java:7936)
at com.codename1.ui.Display.processSerialCalls(Display.java:1152)
at com.codename1.ui.Display.edtLoopImpl(Display.java:1096)
at com.codename1.ui.Display.mainEDTLoop(Display.java:997)
at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120)
at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176)
与此相反,在提交应用程序数小时后,设备会对购买进行收费(因此项目被找到且不为空)。然而,当我重新启动应用程序时,它仍然是轻版本

下面是我如何测试它是否是轻型版本(在主类的init方法中):

根据这个问题(以及从那时起关闭的提到的RFE),我假设
是购买的
也应该在Android上工作。所以我不知道为什么它不起作用

其实我的问题是:

是否可以使用模拟器测试应用内购买

waspowered
是检查用户是否购买了该功能的正确方法吗


谢谢你给我的提示

模拟器没有连接到google play,并且可以为您期望出现的内容返回null。请注意,有一些API指示一些事项,例如是否支持项目列表等


您可以通过simulator菜单操纵purchase API的某些元素。

因此,要摆脱purchase()方法返回模拟器后立即出现的NPE,主类必须实现PurchaseCallback接口。

主CN1类是具有start()和init()方法的类,而不是[由Shai指示的][2]状态机。这是一个至关重要的部分,应该在[Purchase tutorial][3]中予以强调,尽管API文档中对此做了很好的描述:

公共接口PurchaseCallback 主类必须实现的回调接口,以便应用内购买工作。一旦主类实现了这个接口,就会调用其中的方法来指示各种购买状态

现在,当after
purchase()
返回时,将调用PurchaseCallback实现中的
itemPurchased()
方法。模拟器在CN1InAppPurchases文件(.Linux上的cn1文件夹)中跟踪购买情况


此外,现在已经实现了PurchaseCallback,在模拟器中(但不是在Android设备上)wasPurchased()方法返回预期值,具体取决于之前的购买()调用成功。

FYI当您收到异常(尤其是在模拟器中)并询问异常时,希望您包括堆栈跟踪,请查看我的更新!谢谢@Shai。模拟器中不支持ItemList。如果模拟器没有连接到Google play,那么我理解为什么!我也理解为什么在购买该商品后,它不会更进一步。
    ParametresGeneraux.setPurchase(Purchase.getInAppPurchase());
    ParametresGeneraux.setLightVersion(true);
    if (ParametresGeneraux.getPurchase().isManagedPaymentSupported()) {
        if (ParametresGeneraux.getPurchase().wasPurchased(ParametresGeneraux.getFullVersionSKU())) {
            ParametresGeneraux.setLightVersion(false);
        }
    }