使用片段实现Android应用内购买

时间:2014-04-23 08:03:24

标签: android android-fragments in-app-billing

我试图在片段上实施应用内购买。我使用了教程http://twigstechtips.blogspot.com/2013/12/android-setting-up-in-app-billing-api.html,包括修改IabHelper。我还需要修改MainActivity:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    PremiumFragment premiumFragment = new PremiumFragment();
    premiumFragment.onActivityResult(requestCode, resultCode, data);
}

将结果发送到片​​段。问题是当Google计费对话框消失时,我需要手动重新加载片段,以调用OnIabPurchaseFinishedListener。我的代码:

public class PremiumFragment extends Fragment implements NamedTopBar,
    OnClickListener {

static final String ITEM_SKU_SUBSCRIPTION = "test";
static final int RC_REQUEST = 10001;
IabHelper iabHelper;
private Button subscriptionButton;
private boolean mBillingServiceReady;
private boolean subBool;
// Callback for when a purchase is finished
private IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
    @Override
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
        Log.d(TAG, "mPurchaseFinishedListener");
        // if we were disposed of in the meantime, quit.
        if (iabHelper == null) {
            return;
        }

        // Don't complain if cancelling
        if (result.getResponse() == IabHelper.IABHELPER_USER_CANCELLED) {
            Log.d(TAG, "User canceled purchase");
            return;
        }

        if (!result.isSuccess()) {
            Log.d(TAG, "Error purchasing: " + result.getMessage());
            if (result.getResponse() == 7) {
                Toast.makeText(getActivity(), "item already purchased!",
                        Toast.LENGTH_LONG).show();
            }
            return;
        }

        if (!verifyDeveloperPayload(purchase)) {
            Log.d(TAG,
                    "Error purchasing. Authenticity verification failed.");
            return;
        }

        // Purchase was success! Update accordingly
        if (purchase.getSku().equals(ITEM_SKU_SUBSCRIPTION)) {
            Toast.makeText(getActivity(),
                    "Thank you for buying SUBSCRIPTION!", Toast.LENGTH_LONG)
                    .show();
            subBool = true;
        }

        initialiseStuff(subBool);
    }
};
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
    @Override
    public void onConsumeFinished(Purchase purchase, IabResult result) {
        // if we were disposed of in the meantime, quit.
        if (iabHelper == null) {
            return;
        }

        if (result.isSuccess()) {
            iabHelper.queryInventoryAsync(iabInventoryListener());
        } else {
            Log.d(TAG, "Error while consuming: " + result);
        }
        // Update the UI to reflect their latest purchase
        initialiseStuff(subBool);
    }
};
private View window;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
    Log.d(TAG, "onCreate");

    initialiseBilling();
}

private void initialiseBilling() {
    if (iabHelper != null) {
        return;
    }

    String base64EncodedPublicKey = "";
    iabHelper = new IabHelper(getActivity(), base64EncodedPublicKey);
    iabHelper.enableDebugLogging(false);

    Log.d(TAG, "Starting setup.");
    iabHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
        @Override
        public void onIabSetupFinished(IabResult result) {
            // Have we been disposed of in the meantime? If so, quit.
            if (iabHelper == null) {
                return;
            }

            // Something went wrong
            if (!result.isSuccess()) {
                Log.d(TAG,
                        "Problem setting up in-app billing: "
                                + result.getMessage()
                );
                return;
            }
            // IAB is fully set up. Now, let's get an inventory of stuff we
            // own.
            Log.d(TAG, "In-app Billing is set up OK");
            mBillingServiceReady = true;

            iabHelper.queryInventoryAsync(iabInventoryListener());
        }
    });

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    window = inflater.inflate(R.layout.premium_fragment, null);
    initViews();
    return window;
}

@Override
public void onDestroy() {
    super.onDestroy();

    if (iabHelper != null) {
        iabHelper.dispose();
        iabHelper = null;
    }
}

private void initViews() {
    subscriptionButton = (Button) window
            .findViewById(R.id.buy_premium_button);
    subscriptionButton.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.buy_premium_button:
            Log.d(TAG, "buy_premium_button");
            if (mBillingServiceReady) {
            /*
             * TODO: for security, generate your payload here for
             * verification. See the comments on verifyDeveloperPayload()
             * for more info. Since this is a SAMPLE, we just use an empty
             * string, but on a production app you should carefully generate
             * this.
             */
                if (iabHelper != null)
                    iabHelper.flagEndAsync();
                String payload = "";
                iabHelper.launchPurchaseFlow(getActivity(),
                        ITEM_SKU_SUBSCRIPTION, RC_REQUEST,
                        mPurchaseFinishedListener, payload);
            } else {
                showToast();
            }
            break;
    }
}

private void showToast() {
    Toast.makeText(
            getActivity(),
            "Purchase requires Google Play Store (billing) on your Android.",
            Toast.LENGTH_LONG).show();
}

private IabHelper.QueryInventoryFinishedListener iabInventoryListener() {
    return new IabHelper.QueryInventoryFinishedListener() {
        @Override
        public void onQueryInventoryFinished(IabResult result,
                                             Inventory inventory) {
            // Have we been disposed of in the meantime? If so, quit.
            if (iabHelper == null) {
                return;
            }

            // Something went wrong
            if (!result.isSuccess()) {
                Log.d(TAG,
                        "onFailure: QueryInventoryFinishedListener," +
                                "result: " + result
                );
                return;
            }
            Log.d(TAG, "Checking for purchases");
            Purchase purchaseSubscription = inventory
                    .getPurchase(ITEM_SKU_SUBSCRIPTION);

            subBool = (purchaseSubscription != null && verifyDeveloperPayload(purchaseSubscription));
            initialiseStuff(subBool);
        }
    };
}

private void initialiseStuff(boolean subBool) {
    if (subBool) {
        subscriptionButton.setText("You already have premium");
        subscriptionButton.setEnabled(false);
    } else {
        subscriptionButton.setEnabled(true);
    }
}

boolean verifyDeveloperPayload(Purchase purchase) {
    // String payload = p.getDeveloperPayload();
    return true;
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (iabHelper == null)
        return;

    // Pass on the activity result to the helper for handling
    if (!iabHelper.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.");
    }
}

如何在对话框消失后自动调用mPurchaseFinishedListener?

0 个答案:

没有答案