2013-06-30 18 views
10

私は髪を引き出しています!先週のある時点で、私はこれを働かせました。Android IAB - 成功した購入後にアクティビティが破棄されました

私は、in-ap請求を追加しようとしているAndroidアプリを持っています。私はTrivialDriveサンプルを辿り、私のコードは数回働いた。今それはしません。

私はいくつかの無料質問があるシンプルなトリビアゲームを作成しており、さらに質問をするためにアップグレードするオプションを用意しています。ユーザーが無料の質問のリストを完了すると、「ゲームオーバー」画面に移動し、そこで回答を消去して再起動したり、アップグレードしたりすることができます。

「アップグレード」ボタンをクリックすると、購入は成功することができますが、Googleの「お支払い成功」ダイアログが消えると、アクティビティが破棄され、メインのアクティビティに戻されます。

戻って購入をやり直すと、私のコードはエラー(「あなたはすでにこのアイテムを所有しています」)をキャッチし、それを適切に処理します。私のコードは、彼らがすでにアップグレードを所有していることをユーザーに説明し、ボタンをクリックして再生を続行できるようにします。 OnIabPurchaseFinishedListenerがこの時点で起動しているようです。

Googleヘルパーコードを最新のファイルで更新しました。

回答を探すための助力や提案は、非常に高く評価されています。

ありがとうございました。

これが私の活動に関連するコードです:FYI

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

} 
+0

更新が..私のゲームで3日間の遅延を引き起こしました。ユーザー(私) –

+0

onIabPurchaseFinishedイベントは、購入が成功した後ではまったく発生しませんが、ユーザーが既にアイテムを所有している場合は起動します。 –

+1

FYI:これがあると思いますそれを見いだすかもしれない他の誰かのために考え出した。 Google Playストアの起動に使用していたアクティビティが「FLAG_ACTIVITY_NO_HISTORY」で呼び出されました。ユーザーがクリックしてこの「ゲームオーバー」アクティビティに戻ることを望んでいないため、これを行いました。 しかし、これは "In App Billing"の悲しみを引き起こします。したがって、「FLAG_ACTIVITY_NO_HISTORY」が設定されているアクティビティから「In App Billing」を起動しないようにしてください。 平和は –

答えて

13

:私は、私は、これは考え出したと思う - それに遭遇する可能性があり、誰のために。

「In App Billing」を起動するために使用していたアクティビティが、「FLAG_ACTIVITY_NO_HISTORY」で呼び出されました。ユーザーがクリックしてこの「ゲームオーバー」アクティビティに戻ることを望んでいないため、これを行いました。

しかし、これは「App In Billing」で悲嘆を引き起こします。したがって、「FLAG_ACTIVITY_NO_HISTORY」が設定されているアクティビティから「In App Billing」を起動しないようにしてください。

私の元のコード:

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

更新コード:

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

平和

+3

OMG YOUはJUST MEを救っ!!!!!!!!!!!!!!!!!!!!!!!!!!!!! – idish

+1

......あなたは私の新しいメシアです..... – edoardotognoni

+1

オグ、あなたは私のヒーローです!私のそんなに頭痛を救った。これは2013年以降のものですが、Googleではまだこの問題を修正していません。それともそれを文書化したのか。 –

8

私がコメントするほど高くないんだけど、あなたを祝福。私は私の活動のためのAndroidManifest.xmlで

android:noHistory="true"

セットを持っていたし、同じ問題を経験していました。

TABされてIABが動作しています。わーい!

1

あなたのIabHelper.OnIabPurchaseFinishedListenerが別のスレッドで呼び出され、あなたのアクティビティでonResume()が呼び出される前に忘れないでください!

だからあなたUpgradeComplete()またはUpgradeErrorは()古いデバイス(私のジンジャーブレッドソニーのXperiaミニProの上のすべての時間をクラッシュし、サムスンギャラクシーS4上の問題なく働いていた(アンドロイド4.2.2)

にクラッシュを引き起こす可能性があります私のテスト購入は私のGoogle商人のアカウントに現れている私のコードは、右の何かをしなければなりません。しかし成功した購入がに指示されていないので、何かがまだ機能していません:。

+0

ジンジャーブレッドで働くことをあなたの解決策は何でしたか?私は実際に今同じ問題に直面しています。私が考えることは、UIThreadのUI関連のものを更新する必要があるということです。それが問題を解決するかもしれない。あなたがすでに提供してくれたポインタをありがとう。 –

関連する問題