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