2013-01-18 12 views
2

我一直在尝试在我正在开发的游戏的应用程序结算中实现,但是我得到一个NullPointerException,我只是看不到原因。在应用程序结算中使用NullPointerException?

BuyActivity.java:

package com.liamw.games.whatami; 

import java.util.ArrayList; 
import java.util.List; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.Bundle; 
import android.provider.Settings.Secure; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 

import com.liamw.games.whatami.util.IabHelper; 
import com.liamw.games.whatami.util.IabResult; 
import com.liamw.games.whatami.util.Inventory; 
import com.liamw.games.whatami.util.Purchase; 

public class BuyActivity extends Activity { 

    String key, androidid; 
    IabHelper mHelper; 
    Button fifty; 
    ProgressDialog wait; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // DONE Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_buy); 

     fifty = (Button) findViewById(R.id.b50hints); 
     androidid = Secure.getString(BuyActivity.this.getContentResolver(), 
       Secure.ANDROID_ID); 

     final ProgressDialog wait = new ProgressDialog(this); 
     wait.setTitle("Updating..."); 
     wait.setMessage("Please wait while the details are loaded..."); 
     wait.setCancelable(false); 
     wait.show(); 

     key = "xxxxx"; 
     mHelper = new IabHelper(this, key); 

     mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 
      public void onIabSetupFinished(IabResult result) { 
       if (!result.isSuccess()) { 
        // Oh noes, there was a problem. 
        Log.d("What Am I - IAB", 
          "Problem setting up In-app Billing: " + result); 
       } 
       // Hooray, IAB is fully set up! 

       List<String> additionalSkuList = new ArrayList<String>(); 
       additionalSkuList.add("50hints"); 

       mHelper.queryInventoryAsync(true, additionalSkuList, 
         mQueryFinishedListener); 

      } 
     }); 

     fifty.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 

       mHelper.launchPurchaseFlow(BuyActivity.this, "50hints", 10001, 
         mPurchaseFinishedListener, androidid); 
       fifty.setEnabled(false); 

      } 
     }); 

    } 

    IabHelper.QueryInventoryFinishedListener mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener() { 
     public void onQueryInventoryFinished(IabResult result, 
       Inventory inventory) { 
      if (result.isFailure()) { 
       // handle error 
       return; 
      } 

      String fiftyhintscost = inventory.getSkuDetails("50hints").getPrice(); 

      fifty.setText("50 Hints: " + fiftyhintscost); 
      wait.dismiss(); 
      // update the UI 
     } 
    }; 

    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 
     public void onIabPurchaseFinished(IabResult result, Purchase purchase) { 
      if (result.isFailure()) { 
       Log.d("What Am I? IAB", "Error purchasing: " + result); 
       return; 
      } else if (purchase.getSku().equals("50hints") 
        && purchase.getDeveloperPayload().equals(androidid)) { 
       // consume the gas and update the UI 
       mHelper.consumeAsync(purchase, mConsumeFinishedListener); 
      } 
      fifty.setEnabled(true); 
     } 
    }; 

    IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { 
     public void onConsumeFinished(Purchase purchase, IabResult result) { 
      if (result.isSuccess()) { 
       // provision the in-app purchase to the user 
       // (for example, credit 50 gold coins to player's character) 
       Toast.makeText(BuyActivity.this, 
         "Purchase Successful - Crediting!", Toast.LENGTH_LONG) 
         .show(); 
      } else { 
       // handle error 
      } 
     } 
    }; 

    @Override 
    public void onDestroy() { 
     if (mHelper != null) 
      mHelper.dispose(); 
     mHelper = null; 
     super.onDestroy(); 
    } 
} 

的logcat:

01-18 19:12:45.829: E/AndroidRuntime(16849): FATAL EXCEPTION: main 
01-18 19:12:45.829: E/AndroidRuntime(16849): java.lang.NullPointerException 
01-18 19:12:45.829: E/AndroidRuntime(16849): at com.liamw.games.whatami.BuyActivity$1.onQueryInventoryFinished(BuyActivity.java:87) 
01-18 19:12:45.829: E/AndroidRuntime(16849): at com.liamw.games.whatami.util.IabHelper$2$1.run(IabHelper.java:533) 
01-18 19:12:45.829: E/AndroidRuntime(16849): at android.os.Handler.handleCallback(Handler.java:725) 
01-18 19:12:45.829: E/AndroidRuntime(16849): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-18 19:12:45.829: E/AndroidRuntime(16849): at android.os.Looper.loop(Looper.java:137) 
01-18 19:12:45.829: E/AndroidRuntime(16849): at android.app.ActivityThread.main(ActivityThread.java:5039) 
01-18 19:12:45.829: E/AndroidRuntime(16849): at java.lang.reflect.Method.invokeNative(Native Method) 
01-18 19:12:45.829: E/AndroidRuntime(16849): at java.lang.reflect.Method.invoke(Method.java:511) 
01-18 19:12:45.829: E/AndroidRuntime(16849): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
01-18 19:12:45.829: E/AndroidRuntime(16849): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
01-18 19:12:45.829: E/AndroidRuntime(16849): at dalvik.system.NativeStart.main(Native Method) 

87号线:

String fiftyhintscost = inventory.getSkuDetails("50hints").getPrice(); 

请帮我找到空指针的源头,并告诉我如何解决它...

+1

因此,无论'inventory'或'getSkuDetails()'是空的结果,还有什么可能是错误的? – dmon

+0

是的,但我该如何解决它@dmon?它不应该为空吗? –

+0

我不知道什么可能是错的。你确定这是正确的SKU吗?通过调试来检查库存中的值。并且不要认为任何东西都不为空,特别是从看起来像是地图的东西中检索东西时。 – dmon

回答

1

转s出,你只能在SKU使用字母...

+3

我不认为这是真的。特别是从文档:产品ID在应用程序的命名空间中是唯一的。产品ID必须以小写字母或数字开头,并且必须仅使用小写字母(a-z),数字(0-9),下划线(_)和点(。)组成。产品ID“android.test”是保留的,所有产品ID都以“android.test”开头。 此外,您无法在创建产品ID后修改其产品ID,也无法重新使用产品ID。 http://developer.android.com/google/play/billing/billing_admin.html – sghael

相关问题