我一直在尝试为我的第一个应用程序设置应用内结算,并且一直在使用android.test.purchased sku.购买过来了,我设法将SKU放入我的库存中,但正如标题所示,onIabPurchaseFinished永远不会被调用.
我认为它可能与此日志有关:"无法保存哪个视图具有焦点,因为焦点视图com.android.internal.policy.impl.PhoneWindow$DecorView@406743d0没有id".在进入Google Play之前就会弹出.我不太确定这意味着什么......
发布购买:
mHelper.launchPurchaseFlow(this, sku, 10001, mPurchaseFinishedListener, "");
Run Code Online (Sandbox Code Playgroud)
和听众:
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
@Override
public void onIabPurchaseFinished(IabResult result, Purchase info) {
System.out.println("Purchase Finish heard something");
if (result.isFailure()) {
Log.d(TAG, "Error purchasing: " + result);
return;
} else{
Log.d(TAG,"Success!");
}
}
};
Run Code Online (Sandbox Code Playgroud) 我正在使用IabHelperGoogle的教程推荐的实用程序类,我受到这个错误的打击.显然IabHelper无法同时运行多个异步操作.我甚至设法通过尝试开始购买,同时库存盘点仍在进行中.
我已经尝试onActivityResult在我的主类中实现这里建议,但我甚至在错误命中之前都没有调用该方法.然后我发现了这个,但我不知道在哪里找到这个flagEndAsync方法 - 它不在IabHelper课堂上.
现在我正在寻找解决这个问题的方法(没有重新实现整个她的爆炸).我能想到的唯一解决方案是创建一个asyncActive在异步任务启动之前检查的布尔字段,如果有另一个任务处于活动状态,则不执行此操作.但是这有许多其他问题,并且不适用于各种活动.此外,我希望有一个异步任务队列,并在允许的情况下尽快运行,而不是根本不运行.
针对这个问题的解决方案?
我已经尝试了几天来解决这个问题,使用SDK附带的Dungeons演示代码.我试过谷歌寻求答案,但找不到答案.
android.test.purchased在控制台上创建的产品列表和已发布的订阅(我想要的应用程序的主要功能).但我仍然得到错误,Signature verification failed然后签名与数据不匹配.我怎么解决这个问题?
public static ArrayList<VerifiedPurchase> verifyPurchase(String signedData, String signature)
{
if (signedData == null) {
Log.e(TAG, "data is null");
return null;
}
if (Consts.DEBUG) {
Log.i(TAG, "signedData: " + signedData);
}
boolean verified = false;
if (!TextUtils.isEmpty(signature)) {
String base64EncodedPublicKey = "MIIBIjA....AQAB";
PublicKey key = Security.generatePublicKey(base64EncodedPublicKey);
verified = Security.verify(key, signedData, signature);
if (!verified) {
Log.w(TAG, "signature does not match data.");
return null;
}
}
}
public static boolean verify(PublicKey publicKey, String …Run Code Online (Sandbox Code Playgroud) 我正在测试我的账单,我得到了这个例外:
java.lang.IllegalStateException: Can't start async operation (launchPurchaseFlow) because another async operation(launchPurchaseFlow) is in progress.
at utils.IabHelper.flagStartAsync(IabHelper.java:711)
at utils.IabHelper.launchPurchaseFlow(IabHelper.java:316)
at utils.IabHelper.launchPurchaseFlow(IabHelper.java:294)
at com.problemio.SubscribeIntroActivity$6.onClick(SubscribeIntroActivity.java:117)
at android.view.View.performClick(View.java:2532)
at android.view.View$PerformClick.run(View.java:9308)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:150)
at android.app.ActivityThread.main(ActivityThread.java:4293)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
我运行此代码后:
Button subscribe = (Button)findViewById(R.id.subscribe);
subscribe.setOnClickListener(new Button.OnClickListener()
{
public void onClick(View v)
{
// FIRST CHECK IF THE USER IS ALREADY A SUBSCRIBER.
mHelper.launchPurchaseFlow(SubscribeIntroActivity.this, SUBSCRIBE_SKU, RC_REQUEST, mPurchaseFinishedListener);
}
});
Run Code Online (Sandbox Code Playgroud)
但在此之前,我将其作为测试用户运行,并使用测试产品ID,即:android.test.purchased并且它有效.但是,当我将产品ID更改为我自己的产品ID时,它会因上述异常而崩溃.
有没有想过为什么会这样?谢谢!
我正在关注Google的教程和代码示例,了解如何实施应用内结算.问题是我在片段中这样做.
直到最后一步,一切似乎都没有实现,但是我应该实现这个方法:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);
if (mHelper == null) return;
// 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 …Run Code Online (Sandbox Code Playgroud)