2015-10-16 192 views
1

我使用GameHelper类和IabHelper类在我的libgdx游戏中实现了Google Play商店。排行榜可以工作,但如果我尝试购买Google Play商店的商品时说:“需要授权,请使用Google帐户登录”。在我实施IabHelper之前,我的游戏向我展示了使用我的帐户登录,但现在我什么都看不到,但没有登录我看不到排行榜或? 我希望你能帮助我,为什么谷歌Play商店显示我的错误Google Play商店错误libgdx游戏

这里是androidlauncher代码:

public class AndroidLauncher extends AndroidApplication implements GameHelper.GameHelperListener, ActionResolver, IabInterface { 

private GameHelper gameHelper; 
IabHelper mHelper; 

@Override 
protected void onCreate (Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    if (gameHelper == null) { 
     gameHelper = new GameHelper(this, GameHelper.CLIENT_GAMES); 
     gameHelper.enableDebugLog(true); 
    } 
    gameHelper.setup(this); 

    String base64EncodedPublicKey = "{----}"; //here stand my key 

    mHelper = new IabHelper(this,base64EncodedPublicKey); 

    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 
     public void onIabSetupFinished(IabResult result) { 
      if (!result.isSuccess()) { 
       // Oh noes, there was a problem. 
       Log.d("IAB", "Problem setting up In-app Billing: " + result); 
      } 
      // Hooray, IAB is fully set up! 
      Log.d("IAB", "Billing Success: " + result); 
     } 
    }); 

    AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); 

    config.useAccelerometer = false; 
    config.useCompass = false; 
    config.useWakelock = true; 

    initialize(new mygame(this,this), config); 

} 

@Override 
public void onStart() { 
    super.onStart(); 
    gameHelper.onStart(this); 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    gameHelper.onStop(); 
} 

@Override 
public void onSignInFailed() { 
    // TODO Auto-generated method stub 
    System.out.println("Sign in failed"); 
} 

@Override 
public void onSignInSucceeded() { 
    // TODO Auto-generated method stub 
    System.out.println("Sign in succeeded"); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    super.onActivityResult(requestCode, resultCode, data); 
    gameHelper.onActivityResult(requestCode, resultCode, data); 

    if (mHelper != null) { 
     // Pass on the activity result to the helper for handling 
     if (mHelper.handleActivityResult(requestCode, resultCode, data)) { 
      Log.d("IAB", "onActivityResult handled by IABUtil."); 
     } 
    } 
} 

@Override 
public boolean getSignedInGPGS() { 
    return gameHelper.isSignedIn(); 
} 

@Override 
public void loginGPGS() { 
    try { 
     runOnUiThread(new Runnable(){ 
      public void run() { 
       gameHelper.beginUserInitiatedSignIn(); 
      } 
     }); 
    } catch (final Exception ex) { 
    } 
} 

@Override 
public void submitScoreGPGS(int score) { 
    Games.Leaderboards.submitScore(gameHelper.getApiClient(), "----", score); //---- is my leaderboardkey 
} 

@Override 
public void unlockAchievementGPGS(String achievementId) { 
    Games.Achievements.unlock(gameHelper.getApiClient(), achievementId); 
} 

@Override 
public void getLeaderboardGPGS() { 
    if (gameHelper.isSignedIn()) { 
     startActivityForResult(Games.Leaderboards.getLeaderboardIntent(gameHelper.getApiClient(), "----"), 100); //---- is my leaderboardkey 
    } 
    else if (!gameHelper.isConnecting()) { 
     loginGPGS(); 
    } 
} 

@Override 
public void getAchievementsGPGS() { 
    if (gameHelper.isSignedIn()) { 
     startActivityForResult(Games.Achievements.getAchievementsIntent(gameHelper.getApiClient()), 101); 
    } 
    else if (!gameHelper.isConnecting()) { 
     loginGPGS(); 
    } 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    if (mHelper != null) mHelper.dispose(); 
    mHelper = null; 
} 

@Override 
public void buy_100_random_points() { 
    mHelper.launchPurchaseFlow(this,one_hundret_random_points,RC_Request,mPurchaseFinishedListener,"HANDLE_PAYLOADS"); 
} 

// Callback for when a purchase is finished 
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) { 
     if (purchase == null) return; 
     Log.d("IAB", "Purchase finished: " + result + ", purchase: " + purchase); 

     // if we were disposed of in the meantime, quit. 
     if (mHelper == null) return; 

     if (result.isFailure()) { 
      //complain("Error purchasing: " + result); 
      //setWaitScreen(false); 
      return; 
     } 
//   if (!verifyDeveloperPayload(purchase)) { 
//    //complain("Error purchasing. Authenticity verification failed."); 
//    //setWaitScreen(false); 
//    return; 
//   } 

     Log.d("IAB", "Purchase successful."); 

     if (purchase.getSku().equals(one_hundret_random_points)) { 
      // bought the premium upgrade! 
      Log.d("IAB", "Purchase is premium upgrade. Congratulating user."); 

      // Do what you want here maybe call your game to do some update 
      // 
      // Maybe set a flag to indicate that ads shouldn't show anymore 


     } 
    } 
}; 

} 

本教程帮助我:tutorial link

如果我点击购买按钮logcat以红色显示我:

10-19 06:33:27.980 2350-2361/? E/Parcel: Class not found when unmarshalling:  com.google.android.finsky.billing.lightpurchase.PurchaseParams 
10-19 06:33:27.980 2350-2361/? E/Parcel: java.lang.ClassNotFoundException: com.google.android.finsky.billing.lightpurchase.PurchaseParams 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at java.lang.Class.classForName(Native Method) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at java.lang.Class.forName(Class.java:204) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at java.lang.Class.forName(Class.java:169) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Parcel.readParcelableCreator(Parcel.java:2091) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Parcel.readParcelable(Parcel.java:2055) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Parcel.readValue(Parcel.java:1971) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Parcel.readMapInternal(Parcel.java:2255) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Bundle.unparcel(Bundle.java:223) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Bundle.getString(Bundle.java:1082) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.content.Intent.getStringExtra(Intent.java:4961) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at com.android.server.am.ActivityStack.startActivityLocked(ActivityStack.java:3761) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at com.android.server.am.ActivityStack.startActivityMayWait(ActivityStack.java:4977) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at com.android.server.am.ActivityManagerService.startActivityInPackage(ActivityManagerService.java:3391) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at com.android.server.am.PendingIntentRecord.sendInner(PendingIntentRecord.java:254) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at com.android.server.am.ActivityManagerService.startActivityIntentSender(ActivityManagerService.java:3283) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:258) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2125) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Binder.execTransact(Binder.java:388) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at dalvik.system.NativeStart.run(Native Method) 
10-19 06:33:27.980 2350-2361/? E/Parcel: Caused by: java.lang.NoClassDefFoundError: com/google/android/finsky/billing/lightpurchase/PurchaseParams 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at java.lang.Class.classForName(Native Method)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at java.lang.Class.forName(Class.java:204)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at java.lang.Class.forName(Class.java:169)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Parcel.readParcelableCreator(Parcel.java:2091)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Parcel.readParcelable(Parcel.java:2055)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Parcel.readValue(Parcel.java:1971)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Parcel.readMapInternal(Parcel.java:2255)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Bundle.unparcel(Bundle.java:223)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Bundle.getString(Bundle.java:1082)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.content.Intent.getStringExtra(Intent.java:4961)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at com.android.server.am.ActivityStack.startActivityLocked(ActivityStack.java:3761)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at com.android.server.am.ActivityStack.startActivityMayWait(ActivityStack.java:4977)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at com.android.server.am.ActivityManagerService.startActivityInPackage(ActivityManagerService.java:3391)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at com.android.server.am.PendingIntentRecord.sendInner(PendingIntentRecord.java:254)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at com.android.server.am.ActivityManagerService.startActivityIntentSender(ActivityManagerService.java:3283)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:258)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2125)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Binder.execTransact(Binder.java:388)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at dalvik.system.NativeStart.run(Native Method)  
10-19 06:33:27.980 2350-2361/? E/Parcel: Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.finsky.billing.lightpurchase.PurchaseParams" on path: . 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:64) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 
10-19 06:33:27.980 2350-2361/? E/Parcel:  at java.lang.Class.classForName(Native Method)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at java.lang.Class.forName(Class.java:204)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at java.lang.Class.forName(Class.java:169)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Parcel.readParcelableCreator(Parcel.java:2091)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Parcel.readParcelable(Parcel.java:2055)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Parcel.readValue(Parcel.java:1971)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Parcel.readMapInternal(Parcel.java:2255)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Bundle.unparcel(Bundle.java:223)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Bundle.getString(Bundle.java:1082)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.content.Intent.getStringExtra(Intent.java:4961)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at com.android.server.am.ActivityStack.startActivityLocked(ActivityStack.java:3761)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at com.android.server.am.ActivityStack.startActivityMayWait(ActivityStack.java:4977)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at com.android.server.am.ActivityManagerService.startActivityInPackage(ActivityManagerService.java:3391)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at com.android.server.am.PendingIntentRecord.sendInner(PendingIntentRecord.java:254)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at com.android.server.am.ActivityManagerService.startActivityIntentSender(ActivityManagerService.java:3283)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:258)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2125)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at android.os.Binder.execTransact(Binder.java:388)  
10-19 06:33:27.980 2350-2361/? E/Parcel:  at dalvik.system.NativeStart.run(Native Method)  

回答

2

我会告诉你一些指导。这些你必须遵守这封信的指示,好吗?

  • 您使用Google帐户登录开发者控制台,好吗?然后,转到手机中的设置>帐户并删除此帐户,如果您没有更多的Google帐户,那么您必须创建另一个Google帐户来测试inapp帐单,然后将其添加到手机的设置>帐户中。请记住,重复一遍,在您的手机中不能是开发者控制台的Google帐户。使用另一个进行测试,您可以在完成工作后稍后添加帐户。

  • 为了能够测试实际购买,并且不收取费用。你必须添加帐户测试的Gmail在这里开发者控制台: (设置>帐户信息)

enter image description here

你将不得不在瞬间增加信用卡当你点击购买里面你应用程序,但让你确信你可以看到下面的句子不收:

enter image description here

  • 上传已签名的apk文件非常重要(不是调试版),如果您不知道如何操作,请告诉我,我可以帮助您。

  • 取消您的手机中安装的当前apk安装程序,进入商店并通过商店下载测试版,是的,您可以通过此下载测试版,只需复制链接(https://play.google.com/store/apps/details?id=com.yourpackage.change.this),然后确认测试版。为了能够查看并下载测试版本的测试Google帐户,您需要在测试版(或Alpha版)页面中添加测试电子邮件帐户。 在您的开发者控制台的“APK”菜单中,您可以在这里添加测试电子邮件,以查看商店中的apk(在商店中,只能看到apk,此处没有其他人可以看到的人):

enter image description here

当你做了每个点列表在这里,如果你有任何问题,让我知道。 我希望这对你有用。

+0

谢谢,但你看到我骑购买问题已经完成?我希望。购买系统现在不是我的问题,问题是现在的谷歌如果我在Android工作室开始我的游戏,但是如果我上传apk上的谷歌播放,我下载它,我成为一个错误 – wiifree

+0

好吧,我不明白它,现在它的工作,播放服务和购买服务。我不明白谷歌。非常感谢你的帮助 – wiifree

+0

@wiifree好的,这听起来不错。如果你不介意,请为我的答案投票,以获得更多的声誉,只是一点点的奖励,以保持积极主动,并继续帮助别人。再见。 – josemwarrior

0

你能否在logcat中看到类似“问题设置应用内结算:”??的消息? 你的logcat显示什么样的错误?你可以发布吗?

记得买您拥有的项目,以满足几个条件:

  • 您的APK必须上传到您的谷歌Play开发者控制台,它没有必要,你公开发表您的APK,您可以选择“测试版“,只有你可以下载。 (https://play.google.com/apps/publish/)确保您使用您的最终(非调试)证书和私钥签署您的应用程序。
  • 如果您的应用有权购买(<使用权限android:name =“com.android.vending.BILLING”/>),则在Android-manifiest.xml中,您的apk面板中的子菜单将被解锁在Google Play开发者控制台中,您必须定义要购买的商品。 http://developer.android.com/training/in-app-billing/list-iab-products.html#DefineProducts

当你完成这两个步骤,并显示你的痕迹的logcat中,如:

Log.d ("IAB", "Problem setting up In-app Billing:" + result); 

然后我会继续帮助你。

并请更改此:

if (result.isFailure()) { 
     //complain("Error purchasing: " + result); 
     //setWaitScreen(false); 
     return; 
    } 

此:

if (result.isFailure()) { 
     Log.d ("IAB", "Problem with the purchase:" + result); 
     return; 
    } 
+0

我测试了一些。如果我删除base64EncodedPublicKey这个字符串base64EncodedPublicKey =“”;它向我展示了同样的错误。就好像我的游戏不会连接到我的帐户以获取应用内商品 – wiifree

+0

,但logcat对此问题没有显示任何设置应用内结算的信息。它不显示在日志中。它显示此D/IAB:帐单成功:IabResult:安装成功。 (响应:0:好) – wiifree

+0

在开始但后来IAB什么也没有显示 – wiifree