gpt4 book ai didi

Android IAB - 成功购买后 Activity 被销毁

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:56:13 25 4
gpt4 key购买 nike

我要拔头发了!在上周的某一时刻,我进行了这项工作。

我有一个 Android 应用程序,我正在尝试将应用内计费添加到其中。我遵循示例 TrivialDrive,并且我的代码运行了几次。现在不是了。

我正在创建一个简单的问答游戏,其中有许多免费问题,并且可以选择升级以获得更多问题。当用户完成免费问题列表时,他们将被带到“游戏结束”屏幕,在那里他们可以清除他们的答案并重新开始或升级。

当我点击“升级”按钮时,我可以成功购买,但一旦 Google 的“付款成功”对话框消失,我的 Activity 就会被销毁,我会被送回我的主要 Activity。

当我尝试返回并再次购买时,我的代码捕获了错误(“您已经拥有该商品”)并进行了适当处理。我的代码向用户解释他们已经拥有升级,并允许他们单击按钮继续播放。所以看起来 OnIabPurchaseFinishedListener 此时正在触发。

我已使用最新文件更新了 Google 帮助程序代码。

非常感谢任何关于在哪里寻找答案的帮助或建议。

谢谢。

这是我的 Activity 的相关代码:

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

}

最佳答案

仅供引用:我想我已经弄清楚了 - 对于可能遇到它的任何其他人。

我用来启动“In App Billing”的 Activity 被称为“FLAG_ACTIVITY_NO_HISTORY”。我这样做是因为我不希望用户能够单击以返回到此“游戏结束” Activity 。

但是,这会导致“In App Billing”的问题。因此,请确保您不要尝试从已设置“FLAG_ACTIVITY_NO_HISTORY”的 Activity 中启动“应用内结算”。

我的原始代码:

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

和平

关于Android IAB - 成功购买后 Activity 被销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17392884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com