付款后应用内购买崩溃

时间:2013-01-06 17:46:09

标签: android

我写了一个应用内购买测试应用,以了解如何在我已经制作的应用程序中实现它。 我修改了谷歌提供的TrivialDrive示例中的代码。 但它不起作用,在我的朋友付款后应用程序崩溃。 代码看起来像这样

public class MainActivity extends Activity {



    String TAG = "AppPurchaseTest";
    IabHelper mHelper;
    boolean mIsPremium = false;
    static final String SKU_PREMIUM = "premium";
    static final int RC_REQUEST = 10001;


 // User clicked the "Upgrade to Premium" button.
    public void onUpgradeAppButtonClicked(View arg0) {
        Log.d(TAG, "Upgrade button clicked; launching purchase flow for upgrade.");
   //     setWaitScreen(true);
        mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST, mPurchaseFinishedListener);
    }


    //this is not working

 // Callback for when a purchase is finished
    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
            Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase);

            int duration = Toast.LENGTH_SHORT;
            if (result.isFailure()) {
                // Oh noes!
             //   complain("Error purchasing: " + result);
             //   setWaitScreen(false);
                Toast.makeText(getBaseContext(), "Fail :(", duration).show();
                return;
            }

            Log.d(TAG, "Purchase successful.");

            if (purchase.getSku().equals(SKU_PREMIUM)) {
                // bought the premium upgrade!
                Log.d(TAG, "Purchase is premium upgrade. Congratulating user.");
              //  alert("Thank you for upgrading to premium!");
                mIsPremium = true;

                Toast.makeText(getBaseContext(), "Successo: adesso sei premium", duration).show();
                Button test = (Button) findViewById(R.id.test);
                test.setVisibility(View.INVISIBLE);
              //  updateUi();
             //   setWaitScreen(false);
            }
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String base64EncodedPublicKey = null;

        // compute your public key and store it in base64EncodedPublicKey
        mHelper = new IabHelper(this, base64EncodedPublicKey);

        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!  
            }
         });
    }


    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();

        if (mHelper != null) {
            Log.d(TAG, "mHelper doesn't = null ");
        mHelper.dispose();
        mHelper = null;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);

        // Pass on the activity result to the helper for handling
        if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
            // not handled, so handle it ourselves (here's where you'd
            // perform any handling of activity results not related to in-app
            // billing...
            super.onActivityResult(requestCode, resultCode, data);
        }
        else {
            Log.d(TAG, "onActivityResult handled by IABUtil.");
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }


}

你能发现错误吗?我忘了什么?

此教程https://developer.android.com/google/play/billing/billing_integrate.html 看起来更简单,但我不明白如何实现它,是否有一个样本或东西,我可以看到它是如何实现的?我只需要简单升级到高级购买

很难让它工作,因为我不能亲自测试它,每次我测试它我都会亏钱:(

2 个答案:

答案 0 :(得分:1)

花了很长时间才弄清楚我的项目,但你必须明白你的mPurchaseFinishedListener是在非渲染线程上调用的,而且你的应用程序onResume()被调用之前(只需检查IabHelper代码。

因此,如果您尝试进行任何渲染,那么它会崩溃,因为渲染上下文尚未恢复。

在你的情况下,很可能是:

Toast.makeText(getBaseContext(), "Successo: adesso sei premium", duration).show();

将崩溃,同样适用于

Button test = (Button) findViewById(R.id.test);

如果检查琐事示例,textButton可见性设置为true,但按钮本身是在onCreate()方法中指定的类属性。

如果这有帮助,请告诉我。

答案 1 :(得分:0)

每个TrivialDrive您还需要(它将解决此问题):

 // We're being destroyed. It's important to dispose of the helper here!
    @Override
    public void onDestroy() {
        super.onDestroy();

        // very important:
        if (mBroadcastReceiver != null) {
            unregisterReceiver(mBroadcastReceiver);
        }

        // very important:
        Log.d(TAG, "Destroying helper.");
        if (mHelper != null) {
            mHelper.disposeWhenFinished();
            mHelper = null;
        }
    }