看过这个链接:
onIabPurchaseFinished never called.
和....
我已经查看了以下链接 - 这是我面临的确切问题:
IabHelper PurchaseFinishedListener
' kevinl '在上面第二个链接的答案之一 - 是我的问题,即
我有' onActivityResult '在我的活动中编码
控件确实进入了这种方法 - 但是 - 它确实不转到 - onIabPurchaseFinished
我正在调用购买流程如下:
public void onClickIap(View v) {
if(isAlreadyPurchased){
Log.d(TAG, "In onClickIap >>> The app is purchased ");
}else{
Log.d(TAG, "In onClickIap >>> The app is NOT purchased: ");
/** we need to check if this item was purchased from google store details **/
/** makes synchronous call -return control to callback method in listener **/
/** this is the heart of in app - where all the activity starts **/
mHelper.launchPurchaseFlow(this, ITEM_SKU_TEST_4, 10001,mPurchaseFinishedListener, "mypurchasetoken");
mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase){
Log.d(TAG, "In onIabPurchaseFinished ");
if (result.isFailure()) {
Log.d(TAG, "In onIabPurchaseFinished >>> purchase error ");
return;
}else if (purchase.getSku().equals(ITEM_SKU_TEST_4)) {
Log.d(TAG, "In onIabPurchaseFinished purchase success ");
/**TODO update the db **/
DbClass dbDbClass = new DbClass(getApplicationContext());
dbHelper.updatePurchasedQuiz(2);
/** set the flag **/
isAlreadyPurchased = true;
Log.d(TAG, "The app after all the shebang: ");
Intent intent = new Intent(getApplicationContext(),ExamActivity.class);
intent.putExtra("quizId", "2");
startActivity(intent);
}else{
Log.d(TAG, " ");
Log.d(TAG, "In onIabPurchaseFinished in a weird condition ");
}
}
};
}
}
我的 onActivityResult 的实现(我可以看到调试日志)
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, " ");
Log.d(TAG, "<<<<<< in IAP ONACTIVITYRESULT >>>>>>");
Log.d(TAG, "onActivityResult " + requestCode + "," + resultCode + "," + data);
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
}
}
不知道这是否是原因,但我调用/初始化mHelper的方式是:
1在我的活动onCreate中 - 我开始一个线程(AsyncTask)
2在方法 - doInBackground中 - 我正在初始化这个帮助器:
mHelper = new IabHelper(ExamHomeActivity.this, base64EncodedPublicKey);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { .... }
3然后当这个异步任务完成时 - 我在屏幕上显示一些按钮
4单击任何按钮将调用上述方法 - onClickIap
感谢
香卡
答案 0 :(得分:1)
在初始化之前传递mPurchaseFinishedListener(在调用launchPurchaseFlow之后就会发生这种情况)。
另外,在onClick中初始化监听器不是一个好主意。每次按下按钮,您都会这样做。从onClickIap()方法中取出它。
你可以在你的活动中静态地执行此操作,就像在Google的示例应用程序Trivial Drive中一样:
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase){
Log.d(TAG, "In onIabPurchaseFinished ");
...
...
...
}
};
初始化IabHelper可能最好在活动的onCreate()中完成:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_subscribe);
mHelper = new IabHelper(this);
}
然后不要忘记在onDestory()中处理它:
@Override
protected void onDestroy() {
super.onDestroy();
// very important:
if (mHelper != null) {
mHelper.dispose();
mHelper = null;
}
}
此外,无需从后台线程设置IabHelper。只要你准备好,就从你的UI线程中调用mHelper.startSetup。