Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android IAB – Actividad destruida después de una compra exitosa

Estoy sacando mi pelo! En un momento de la última semana, tuve este trabajo.

Tengo una aplicación para Android a la que intento añadir facturación in-ap. Seguí la muestra TrivialDrive, y mi código funcionó un par de veces. Ahora no lo hace.

Estoy creando un juego de trivia simple que tiene un número de preguntas libres, y la opción de actualizar para obtener más preguntas. Cuando el usuario completa la lista de preguntas gratuitas, se llevan a una pantalla de "Juego más" donde pueden borrar sus respuestas y comenzar de nuevo, o actualizar.

Cuando hago clic en el botón "Actualizar", puedo realizar una compra exitosa, pero en cuanto el cuadro de diálogo "Pago exitoso" de Google desaparece, mi actividad se destruye y me devuelven a mi actividad principal.

Cuando intento volver y hacer mi compra otra vez, mi código coge el error ("usted posee ya este artículo") y lo maneja apropiadamente. Mi código explica al usuario que ya poseen la actualización y les permite hacer clic en un botón para continuar jugando. Así que parece que el OnIabPurchaseFinishedListener está disparando en este punto.

He actualizado el código de ayuda de Google con los últimos archivos.

Cualquier ayuda o sugerencias sobre dónde buscar respuestas es muy apreciada.

Gracias.

Este es el código relevante para mi actividad:

public class GameOverActivity extends BaseActivity { private IabHelper mHelper; private String m_base64EncodedPublicKey; private static String THE_UPGRADE_SKU = "upgrade52"; public static int BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED = 7; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_game_over); setTitle("Game Over"); Button butPlay = (Button) findViewById(R.id.buttonPlay); butPlay.setVisibility(View.INVISIBLE); PrepareIAB(); } @Override protected void onResume() { super.onResume(); CURRENT_ACTIVITY = ACTIVITY_GAME_OVER; SetMainText(); } @Override protected void onDestroy() { super.onDestroy(); try { if (mHelper != null) { mHelper.dispose(); mHelper = null; } } catch (Exception e) { } } private void PrepareIAB() { m_base64EncodedPublicKey = "MyKey"; // compute your public key and store it in base64EncodedPublicKey mHelper = new IabHelper(this, m_base64EncodedPublicKey); mHelper.enableDebugLogging( true, TAG); mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { public void onIabSetupFinished(IabResult result) { if (!result.isSuccess()) { ShowMessage("There was an error connecting to the Google Play Store."); } } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { try { // 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."); } } catch (Exception e) { super.onActivityResult(requestCode, resultCode, data); } } IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { public void onIabPurchaseFinished(IabResult result, Purchase purchase) { try { if (result.isFailure()) { if (result.mResponse==7) { UpgradeComplete(); ShowMessage("Thank you for upgrading.\r\n\r\nThis version has 400 more questions."); } else { ShowMessage("Error purchasing: " + String.valueOf(result.mResponse)); UpgradeError(); return; } } else if (purchase.getSku().equals(THE_UPGRADE_SKU)) { UpgradeComplete(); ShowMessage("Thank you for upgrading.\r\n\r\nThis version has 400 more questions."); } else { ShowMessage("Something else happened. "); } } catch (Exception e) { Log.e(TAG, e.getLocalizedMessage()); } } }; private void HideUpgrade() { try { Button btnUpgrade = (Button) findViewById(R.id.buttonUpgrade); if (btnUpgrade != null) { btnUpgrade.setVisibility(View.INVISIBLE); } TextView txtMessage = (TextView) findViewById(R.id.txtUpgradeFromGameOver); if (txtMessage!=null) { txtMessage.setVisibility(View.INVISIBLE); } } catch (Exception e) { } } public void onQuitButtonClick(View view) { finish(); } public void onResetDBButtonClick(View view) { ConfirmResetDatabase(); } private void ConfirmResetDatabase() { DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case DialogInterface.BUTTON_POSITIVE: ResetDatabase(); Intent gameActivity = new Intent(getApplicationContext(), GameActivity.class); gameActivity.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); // startActivityForResult(gameActivity, ACTIVITY_GAME); startActivity(gameActivity); break; case DialogInterface.BUTTON_NEGATIVE: // No button clicked break; } } }; AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to erase your score and start over?").setPositiveButton("Yes", dialogClickListener).setNegativeButton("No", dialogClickListener).show(); } public void onUpgradeButtonClick(View view) { try { if (mHelper != null) { mHelper.launchPurchaseFlow(this, THE_UPGRADE_SKU, 10001, mPurchaseFinishedListener, m_TriviaAppInstance.AppInstallID()); } else { ShowMessage("Unable to connect to Google Play Store."); } } catch (Exception e) { ShowMessage("Unable to connect to Google Play Store."); SendErrorMessage(e.getLocalizedMessage()); } } private void UpgradeComplete() { try { HideUpgrade(); Button butPlay = (Button) findViewById(R.id.buttonPlay); if (butPlay!=null) { butPlay.setVisibility(View.VISIBLE); } TextView txtReset = (TextView) findViewById(R.id.txtGameOverRestDB); if (txtReset!=null) { txtReset.setVisibility(View.INVISIBLE); } Button btnReset = (Button)findViewById(R.id.buttonResetDB); if (btnReset!=null) { btnReset.setVisibility(View.INVISIBLE); } m_TriviaAppInstance.SetUpgradedStatus(true); } catch (Exception e) { } // } private void UpgradeError() { try { Button butUpgrade; butUpgrade = (Button) findViewById(R.id.buttonUpgrade); butUpgrade.setVisibility(View.INVISIBLE); TextView txtMessage = (TextView) findViewById(R.id.txtUpgradeScreen); txtMessage.setText(R.string.upgradeScreenTextError); } catch (Exception e) { } } public void onPlayButtonClick(View view) { Intent myIntent = new Intent(view.getContext(), GameActivity.class); myIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); startActivityForResult(myIntent, ACTIVITY_GAME); } public void SetMainText() { TextView txt = (TextView) findViewById(R.id.txtScoreGlobal); txt.setText(Integer.toString(m_TriviaAppInstance.getGlobal()) + "%"); SetPlayerScore(1); if (m_TriviaAppInstance.getUpgradedStatus() == true) { HideUpgrade(); } } } 

  • Lista oficial de países para la aplicación de facturación Android?
  • ¿Cómo migrar de una aplicación Android pagada a una aplicación pagada con facturación en la aplicación?
  • ¿Qué utilizar como carga útil del desarrollador en las API de facturación de Google In-App?
  • Actualización de una aplicación de Android que utiliza la facturación de aplicaciones
  • Prueba de facturación en la aplicación: android.test.purchased ya propiedad
  • Cupones para la facturación integrada en la aplicación
  • MService.consumePurchase (3, packageName, purchaseToken) devuelve siempre RESULT_DEVELOPER_ERROR = 5 - argumentos no válidos proporcionados a la API
  • ¿En la facturación de la aplicación admite varias cuentas?
  • 3 Solutions collect form web for “Android IAB – Actividad destruida después de una compra exitosa”

    FYI: Creo que tengo esto calculado – para cualquier otra persona que puede venir a través de él.

    La actividad que estaba utilizando para iniciar "In App Billing" se llamó con un "FLAG_ACTIVITY_NO_HISTORY". Hice esto porque no quería que el usuario pudiera hacer clic para volver a esta actividad de "Game Over".

    PERO, esto causa pena con "En la facturación de la aplicación". Por lo tanto, asegúrese de no intentar iniciar "En la facturación de aplicaciones" de una actividad que tiene el conjunto "FLAG_ACTIVITY_NO_HISTORY".

    Mi código original:

     private void GameOver() { m_TriviaAppInstance.setGameOver(true); Intent gameOver = new Intent(getApplicationContext(), GameOverActivity.class); gameOver.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(gameOver); } 

    Código actualizado:

     private void GameOver() { m_TriviaAppInstance.setGameOver(true); Intent gameOver = new Intent(getApplicationContext(), GameOverActivity.class); startActivity(gameOver); } 

    Paz

    No soy lo suficientemente alto como para comentar, pero te bendigo. tuve

    android:noHistory="true"

    Establecido en AndroidManifest.xml para mi actividad y experimentaba el mismo problema.

    Lo sacó y el IAB está trabajando. ¡Hurra!

    No olvide que su IabHelper.OnIabPurchaseFinishedListener se llama a un hilo diferente y antes de onResume () se llama en su actividad!

    Así que su UpgradeComplete () o UpgradeError () puede causar un choque en los dispositivos más antiguos (Crashed cada vez en mi Sony Xperia Mini Pro y funcionó sin problemas en el Samsung Galaxy S4 (Android 4.2.2)

    Causó un retraso de 3 días en mi juego ..

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.