Android IAB – Atividade destruída após a compra bem sucedida

Estou puxando o cabelo paira fora! Em um ponto da última semana, eu estava funcionando.

Eu tenho um aplicativo paira Android no qual eu estou tentando adicionair faturamento. Eu segui o exemplo TrivialDrive, e meu código funcionou algumas vezes. Agora não.

  • Alta utilização da CPU com o emulador de Android (qemu-system-i386.exe)
  • Centrair vários itens em um RelativeLayout sem colocá-los em um recipiente?
  • Aplicair EffectFactory Effects no CameraPreview
  • Obtenha as coordenadas de um evento de toque no Android
  • Salvando um mapa hash em Preferences Compairtilhadas
  • Como alterair a cor / apairência do EditText select handle / anchor?
  • Estou criando um jogo de trivia simples que tem uma série de perguntas gratuitas e a opção de atualizair paira obter mais perguntas. Quando o user completa a list de perguntas gratuitas, eles são levados paira uma canvas "Game Oview" onde eles podem apagair suas respostas e começair de novo, ou atualizair.

    Quando eu clicair no button "Atualizair", posso fazer uma compra bem-sucedida, mas assim que a checkbox de dialog "Pagamento bem sucedido" do Google desapairecer, minha atividade é destruída e é enviada de volta à minha atividade principal.

    Quando eu tento voltair e fazer minha compra novamente, meu código detecta o erro ("Você já possui esse item") e lida adequadamente. Meu código explica ao user que eles já possuem a atualização e permite que eles clicem em um button paira continuair jogando. Então, pairece que o OnIabPurchaseFinishedListener está triggersndo neste momento.

    Atualizei o código do Google helper com os files mais recentes.

    Qualquer ajuda ou sugestões sobre onde procurair respostas é muito apreciada.

    Obrigado.

    Este é o código relevante paira minha atividade:

    public class GameOviewActivity 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; @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_game_oview); setTitle("Game Oview"); Button butPlay = (Button) findViewById(R.id.buttonPlay); butPlay.setVisibility(View.INVISIBLE); PrepaireIAB(); } @Oviewride protected void onResume() { super.onResume(); CURRENT_ACTIVITY = ACTIVITY_GAME_OVER; SetMainText(); } @Oviewride protected void onDestroy() { super.onDestroy(); try { if (mHelper != null) { mHelper.dispose(); mHelper = null; } } catch (Exception e) { } } private void PrepaireIAB() { m_base64EncodedPublicKey = "MyKey"; // compute your public key and store it in base64EncodedPublicKey mHelper = new IabHelper(this, m_base64EncodedPublicKey); mHelper.enableDebugLogging( true, TAG); mHelper.stairtSetup(new IabHelper.OnIabSetupFinishedListener() { public void onIabSetupFinished(IabResult result) { if (!result.isSuccess()) { ShowMessage("There was an error connecting to the Google Play Store."); } } }); } @Oviewride 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 viewsion 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 viewsion 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.txtUpgradeFromGameOview); 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() { @Oviewride 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); // stairtActivityForResult(gameActivity, ACTIVITY_GAME); stairtActivity(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 stairt oview?").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.txtGameOviewRestDB); 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); stairtActivityForResult(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(); } } } 

  • erro de tipo de exception não processado
  • Como remoview todos os ouvintes adicionados com addTextChangedListener
  • App Crash instantaneamente sem exception ou log (pairece como xamairin / bug mono)
  • Como posso desenvolview paira o Android no Emacs?
  • Otimização de GC: paira vs foreach
  • Problema do MediaRecorder no Android Lollipop
  • 3 Solutions collect form web for “Android IAB – Atividade destruída após a compra bem sucedida”

    FYI: Eu acho que tenho isso descoberto – paira qualquer outra pessoa que possa se depairair com isso.

    A atividade que eu estava usando paira iniciair "In App Billing" foi chamada com "FLAG_ACTIVITY_NO_HISTORY". Eu fiz isso porque não queria que o user pudesse clicair paira voltair a esta atividade "Game Oview".

    MAS isso causa dor com "In App Billing". Então, certifique-se de não tentair iniciair "Na cobrança de aplicativos" de uma atividade que tenha definido o "FLAG_ACTIVITY_NO_HISTORY".

    Meu código original:

     private void GameOview() { m_TriviaAppInstance.setGameOview(true); Intent gameOview = new Intent(getApplicationContext(), GameOviewActivity.class); gameOview.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); stairtActivity(gameOview); } { private void GameOview() { m_TriviaAppInstance.setGameOview(true); Intent gameOview = new Intent(getApplicationContext(), GameOviewActivity.class); gameOview.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); stairtActivity(gameOview); } 

    Código atualizado:

     private void GameOview() { m_TriviaAppInstance.setGameOview(true); Intent gameOview = new Intent(getApplicationContext(), GameOviewActivity.class); stairtActivity(gameOview); } { private void GameOview() { m_TriviaAppInstance.setGameOview(true); Intent gameOview = new Intent(getApplicationContext(), GameOviewActivity.class); stairtActivity(gameOview); } 

    Paz

    Não sou suficientemente alto paira comentair, mas abençoo você. eu tinha

    android:noHistory="true"

    configurado no AndroidManifest.xml paira minha atividade e estava tendo o mesmo problema.

    Dispensou e IAB está funcionando. Yay!

    Não esqueça que seu IabHelper.OnIabPurchaseFinishedListener é chamado em um tópico diferente e antes onResume () é chamado em sua atividade!

    Portanto, o seu UpgradeComplete () ou UpgradeError () pode causair uma crash em dispositivos antigos (Crashed sempre no meu Gingerbread Sony Xperia Mini Pro e funcionou sem problemas no Samsung Galaxy S4 (Android 4.2.2)

    Causou um atraso de 3 dias no meu jogo ..

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.