2013-06-30 28 views
10

Tôi đang kéo tóc ra! Tại một thời điểm trong tuần trước, tôi đã làm việc này.Android IAB - Hoạt động bị hủy sau khi mua thành công

Tôi có một ứng dụng Android mà tôi đang cố thêm thanh toán trong-ap vào. Tôi đã theo mẫu TrivialDrive và mã của tôi đã hoạt động một vài lần. Bây giờ nó không.

Tôi đang tạo trò chơi đố đơn giản có một số câu hỏi miễn phí và tùy chọn nâng cấp để nhận thêm câu hỏi. Khi người dùng hoàn thành danh sách các câu hỏi miễn phí, họ sẽ được đưa đến màn hình "Game Over", nơi họ có thể xóa câu trả lời của họ và bắt đầu lại hoặc nâng cấp.

Khi tôi nhấp vào nút "Nâng cấp", tôi có thể mua thành công, nhưng ngay khi hộp thoại "Thanh toán thành công" của Google biến mất, hoạt động của tôi bị hủy và tôi được gửi trở lại hoạt động chính.

Khi tôi cố gắng quay lại và thực hiện giao dịch mua lại, mã của tôi sẽ phát hiện lỗi ("Bạn đã sở hữu mục này") và xử lý nó một cách thích hợp. Mã của tôi giải thích cho người dùng rằng họ đã sở hữu bản nâng cấp và cho phép họ nhấp vào nút để tiếp tục phát. Vì vậy, có vẻ như OnIabPurchaseFinishedListener đang kích hoạt tại thời điểm này.

Tôi đã cập nhật mã trợ giúp của Google với các tệp mới nhất.

Bất kỳ trợ giúp hoặc đề xuất nào về nơi để tìm câu trả lời đều được đánh giá cao.

Cảm ơn.

Đây là mã có liên quan đối với hoạt động của tôi:

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

Cập nhật: Mã của tôi phải thực hiện điều gì đó đúng. Các giao dịch mua thử nghiệm của tôi đang hiển thị trong tài khoản người bán Google của tôi.Nhưng điều gì đó vẫn không hoạt động do giao dịch mua thành công không được chỉ định người dùng (tôi) –

+0

Sự kiện onIabPurchaseFinished không được kích hoạt sau khi mua thành công NHƯNG, nó sẽ kích hoạt nếu người dùng đã sở hữu sản phẩm –

+1

FYI: Tôi nghĩ rằng tôi có điều này đã tìm ra - cho bất kỳ ai khác có thể bắt gặp nó. Hoạt động tôi đang sử dụng để khởi chạy cửa hàng Google Play được gọi bằng "FLAG_ACTIVITY_NO_HISTORY". Tôi đã làm điều này vì tôi không muốn người dùng có thể nhấp để quay lại hoạt động "Game Over" này. NHƯNG, điều này gây ra sự đau buồn với "Trong thanh toán ứng dụng". Vì vậy, hãy đảm bảo bạn không cố gắng khởi chạy "Trong thanh toán ứng dụng" từ một hoạt động đã có bộ "FLAG_ACTIVITY_NO_HISTORY". Hòa bình –

Trả lời

13

FYI: Tôi nghĩ rằng tôi có điều này đã tìm ra - cho bất cứ ai khác mà có thể đi qua nó.

Hoạt động mà tôi đang sử dụng để khởi chạy "Thanh toán trong ứng dụng" được gọi bằng "FLAG_ACTIVITY_NO_HISTORY". Tôi đã làm điều này vì tôi không muốn người dùng có thể nhấp để quay lại hoạt động "Game Over" này.

NHƯNG, điều này gây ra sự đau buồn với "Trong thanh toán ứng dụng". Vì vậy, hãy đảm bảo bạn không cố gắng khởi chạy "Trong thanh toán ứng dụng" từ một hoạt động đã có bộ "FLAG_ACTIVITY_NO_HISTORY".

mã ban đầu của tôi:

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

đang Cập nhật:

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

Hòa bình

+3

OMG QUÝ VỊ ĐÃ BỎ CHO TÔI !!!!!!!!!!!!!!!!!!!!!!!!!!!!! – idish

+1

...... bạn là Đấng cứu thế mới của tôi ..... – edoardotognoni

+1

Omg, bạn là anh hùng của tôi! Lưu đau đầu của tôi rất nhiều. Đây là từ năm 2013 và Google vẫn chưa khắc phục được sự cố này? Hoặc thậm chí là ghi lại nó. –

8

Tôi không đủ cao để bình luận, nhưng ban phước cho bạn. Tôi đã

android:noHistory="true"

bộ trong AndroidManifest.xml cho hoạt động của tôi và đã trải qua cùng một vấn đề.

Took it out và IAB đang hoạt động. Yay!

1

Đừng quên rằng IabHelper.OnIabPurchaseFinishedListener của bạn được gọi trên một luồng khác và trước khi onResume() được gọi trên Hoạt động của bạn!

Vì vậy UpgradeComplete của bạn() hoặc UpgradeError() có thể gây ra một vụ tai nạn trên các thiết bị cũ (Crashed mỗi lần về tôi Gingerbread Sony Xperia Mini Pro và làm việc mà không có rắc rối nào trên Samsung Galaxy S4 (Android 4.2.2)

Gây chậm trễ 3 ngày cho trò chơi của tôi ..

+0

Vì vậy, giải pháp của bạn để làm cho nó hoạt động trên Gingerbread là gì. Tôi thực sự phải đối mặt với cùng một vấn đề ngay bây giờ. Điều tôi có thể nghĩ đến là, tôi có cần cập nhật các nội dung liên quan đến giao diện người dùng trên UIThread không? Và có thể điều đó sẽ giải quyết được vấn đề. Cảm ơn con trỏ bạn đã cung cấp. –

Các vấn đề liên quan