android - test - IabHelper PurchaseFinishedListener
pay app billing (4)
AndroidPenguin, tengo el mismo problema que usted, pero tengo el resultado de la actividad configurado correctamente y, sin embargo, mi comprador finalizado no se ejecuta.
Aquí está mi onActivityResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (SettingsManager.getBooleanSetting(rootId, "inapppurchase", false)){
Log.d(TAG, "take care of activity result with billing helper");
if (!mBillingService.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.");
}
}
else
super.onActivityResult(requestCode, resultCode, data);
}
Si envío un intento de compra a través del estándar.
String mySku = "android.test.purchased";
mHelper.launchPurchaseFlow(this, mySku, 10001, mPurchaseFinishedListener);
Puedo comprar el artículo y se almacenará y puedo consultar el artículo y también funciona bien. Lo único que no funciona es el PurchaseFinishedListener. Lo tengo codificado casi idéntico a la aplicación de ejemplo, sin embargo, no parece que se llame en absoluto.
12-12 01:40:47.248: D/IabHelper(23502): Calling getPurchases with continuation token: null
12-12 01:40:50.116: D/IabHelper(23502): Starting async operation: launchPurchaseFlow
Estos son los dos últimos métodos a los que se llama y después de eso, cuando finalizo la compra, no se llama a la compra.
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new OnIabPurchaseFinishedListener() {
@Override
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
Log.d(TAG, "Purchase finished: " + result + ", purchase: "
+ purchase);
if (result.isFailure()) {
complain("Error purchasing: " + result);
// setWaitScreen(false);
return;
}
if (purchase.getSku().equals(mySku)) {
Log.d(TAG, "mySku is being consumed.");
mHelper.consumeAsync(purchase, mConsumeFinishedListener);
}
Log.d(TAG, "Purchase successful.");
new AsyncQuestionsActivity().doInBackground();
}
};
Nada desde el log hasta el final funciona. ¿Hay algo de lo que me esté perdiendo?
Descubrí cómo arreglarlo. Implementar handleActivityResult en onActivityResult. Es necesario crear un puente entre el oyente y el flujo de compra iniciado.
A continuación se muestra el código que utilicé:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + ","
+ data);
// Pass on the activity result to the helper for handling
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
} else {
Log.d(TAG, "onActivityResult handled by IABUtil.");
}
}
En mi caso, está funcionando, intente así, espere hasta que el diálogo de Google Play se cierre por sí mismo. Luego, el oyente será llamado.
Para aquellos de ustedes que tuvieron el mismo problema que yo estaba experimentando ...
Acabo de hacer que mi variable miembro IabHelper sea estática, y eso solucionó el problema.
Ya había agregado el código de AndroidPenguin, y todavía tenía fallos de un IabHelper nulo, después de haber comprado un artículo (por lo que onActivityResult nunca tuvo la oportunidad de llamar handleActivityResult porque mHelper era nulo).