Class 未找到,尝试使用 Play 商店制作多人游戏时解组错误

Class not found, unmarshalling error when trying to make a multiplayer game with play store

所以我想和朋友一起做一款多人游戏。对于多人游戏部分,我将项目连接到开发人员控制台并复制了经典按钮点击器 Google 提供的一些示例代码,以查看编码的工作原理。问题是,当我 运行 它并向某人发送邀请时,它不起作用。邀请显示在另一台设备上,但当它接受邀请时,该项目只能在一台设备上运行 phone,而在另一台设备上停止运行。我使用的是实际设备,而不是模拟器。这是原木猫。

   java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=10002, result=-1, data=Intent { (has extras) }} to activity {ml.digits/ml.digits.MultiPlayerSignIn}: java.lang.IllegalStateException: Room ID must not be null or empty
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4058)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4101)
        at android.app.ActivityThread.access00(ActivityThread.java:177)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1497)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:145)
        at android.app.ActivityThread.main(ActivityThread.java:5942)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
 Caused by: java.lang.IllegalStateException: Room ID must not be null or empty
        at android.os.Parcel.readException(Parcel.java:1548)
        at android.os.Parcel.readException(Parcel.java:1493)
        at com.google.android.gms.games.internal.IGamesService$Stub$Proxy.zzb(Unknown Source)
        at com.google.android.gms.games.internal.GamesClientImpl.zza(Unknown Source)
        at com.google.android.gms.games.internal.api.RealTimeMultiplayerImpl.sendUnreliableMessage(Unknown Source)
        at ml.digits.MultiPlayerSignIn.broadcastScore(MultiPlayerSignIn.java:760)
        at ml.digits.MultiPlayerSignIn.startGame(MultiPlayerSignIn.java:638)
        at ml.digits.MultiPlayerSignIn.onActivityResult(MultiPlayerSignIn.java:229)
        at android.app.Activity.dispatchActivityResult(Activity.java:6549)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4054)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4101)
        at android.app.ActivityThread.access00(ActivityThread.java:177)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1497)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:145)
        at android.app.ActivityThread.main(ActivityThread.java:5942)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

奇怪的是,当我尝试从另一台设备发送邀请时,它连接了两台设备并开始了游戏。在游戏中,您应该可以看到自己的分数和其他玩家的分数,但是,您只能在一台设备上看到这两种分数,而在另一台设备上,您只能看到自己的分数。这是 logcat。

    E/Parcel﹕ Class not found when unmarshalling: com.google.android.gms.games.multiplayer.realtime.RoomEntity
java.lang.ClassNotFoundException: com.google.android.gms.games.multiplayer.realtime.RoomEntity
        at java.lang.Class.classForName(Native Method)
        at java.lang.Class.forName(Class.java:308)
        at java.lang.Class.forName(Class.java:272)
        at android.os.Parcel.readParcelableCreator(Parcel.java:2275)
        at android.os.Parcel.readParcelable(Parcel.java:2239)
        at android.os.Parcel.readValue(Parcel.java:2146)
        at android.os.Parcel.readArrayMapInternal(Parcel.java:2479)
        at android.os.BaseBundle.unparcel(BaseBundle.java:221)
        at android.os.BaseBundle.getString(BaseBundle.java:918)
        at android.content.Intent.getStringExtra(Intent.java:5386)
        at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1811)
        at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1364)
        at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4727)
        at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4572)
        at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:140)
        at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3093)
        at android.os.Binder.execTransact(Binder.java:446)
 Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.games.multiplayer.realtime.RoomEntity" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
        at java.lang.Class.classForName(Native Method)
        at java.lang.Class.forName(Class.java:308)
        at java.lang.Class.forName(Class.java:272)
        at android.os.Parcel.readParcelableCreator(Parcel.java:2275)
        at android.os.Parcel.readParcelable(Parcel.java:2239)
        at android.os.Parcel.readValue(Parcel.java:2146)
        at android.os.Parcel.readArrayMapInternal(Parcel.java:2479)
        at android.os.BaseBundle.unparcel(BaseBundle.java:221)
        at android.os.BaseBundle.getString(BaseBundle.java:918)
        at android.content.Intent.getStringExtra(Intent.java:5386)
        at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1811)
        at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1364)
        at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4727)
        at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4572)
        at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:140)
        at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3093)
        at android.os.Binder.execTransact(Binder.java:446)
        Suppressed: java.lang.ClassNotFoundException: com.google.android.gms.games.multiplayer.realtime.RoomEntity
        at java.lang.Class.classForName(Native Method)
        at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
        at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
        ... 18 more

最后但同样重要的是,这里是 MultiPlayerSignIn.class 中引发错误的方法的代码。

 if (finalScore) {
            Log.d(TAG, "This is the room"+mRoomId);
            // final score notification must be sent via reliable message
                Games.RealTimeMultiplayer.sendReliableMessage(mGoogleApiClient, null, mMsgBuf,
                        mRoomId, p.getParticipantId());

        } else {
            // it's an interim score notification, so we can use unreliable
             Games.RealTimeMultiplayer.sendUnreliableMessage(mGoogleApiClient, mMsgBuf, mRoomId,
                        p.getParticipantId());
        }

这里是创建房间的地方。它不应该是空的

     // Accept the given invitation.
void acceptInviteToRoom(String invId) {
    // accept the invitation
    Log.d(TAG, "Accepting invitation: " + invId);
    RoomConfig.Builder roomConfigBuilder = RoomConfig.builder(this);
    roomConfigBuilder.setInvitationIdToAccept(invId)
            .setMessageReceivedListener(this)
            .setRoomStatusUpdateListener(this);
    switchToScreen(R.id.screen_wait);
    keepScreenOn();
    resetGameVars();
    Games.RealTimeMultiplayer.join(mGoogleApiClient, roomConfigBuilder.build());
}

感谢您的帮助(:Here's 我从哪里获得了代码。

尝试在onJoinedRoom-方法中插入mRoomId = room.getRoomId()

public void onJoinedRoom(int statusCode, Room room) {

    ...

    mRoomId = room.getRoomId();

    ...
}

Google 的示例代码也会出现这种情况。 我在我的三星设备上看到它。 你也在使用 Samsung Note 吗?

一位 Google 工程师声称它对功能没有影响:

https://github.com/playgameservices/cpp-android-basic-samples/issues/17