应用程序不断崩溃,但在模拟器手机上工作

时间:2014-06-14 06:14:46

标签: java android google-play-services

出于某种原因,我的应用程序在模拟器上完美运行,但在我的实际手机(Galaxy S4)上却没有。它只是试图开始然后崩溃,我似乎无法弄清楚问题。任何帮助,将不胜感激。 MainActivity.java

package com.google.example.games.bc;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;

import com.google.android.gms.games.Games;
import com.google.android.gms.games.GamesStatusCodes;
import com.google.android.gms.games.GamesActivityResultCodes;
import com.google.android.gms.games.multiplayer.Invitation;
import com.google.android.gms.games.multiplayer.Multiplayer;
import com.google.android.gms.games.multiplayer.OnInvitationReceivedListener;
import com.google.android.gms.games.multiplayer.Participant;
import com.google.android.gms.games.multiplayer.realtime.RealTimeMessage;
import com.google.android.gms.games.multiplayer.realtime.RealTimeMessageReceivedListener;
import com.google.android.gms.games.multiplayer.realtime.Room;
import com.google.android.gms.games.multiplayer.realtime.RoomConfig;
import com.google.android.gms.games.multiplayer.realtime.RoomStatusUpdateListener;
import com.google.android.gms.games.multiplayer.realtime.RoomUpdateListener;
import com.google.example.games.basegameutils.BaseGameActivity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;


public class MainActivity extends BaseGameActivity
    implements View.OnClickListener, RealTimeMessageReceivedListener,
    RoomStatusUpdateListener, RoomUpdateListener, OnInvitationReceivedListener {

/*
 * API INTEGRATION SECTION. This section contains the code that integrates
 * the game with the Google Play game services API.
 */

// Debug tag
final static boolean ENABLE_DEBUG = true;
final static String TAG = "ButtonClicker2000";

// Request codes for the UIs that we show with startActivityForResult:
final static int RC_SELECT_PLAYERS = 10000;
final static int RC_INVITATION_INBOX = 10001;
final static int RC_WAITING_ROOM = 10002;

// Room ID where the currently active game is taking place; null if we're
// not playing.
String mRoomId = null;

// Are we playing in multiplayer mode?
boolean mMultiplayer = false;

// The participants in the currently active game
ArrayList<Participant> mParticipants = null;

// My participant ID in the currently active game
String mMyId = null;

// If non-null, this is the id of the invitation we received via the
// invitation listener
String mIncomingInvitationId = null;

// Message buffer for sending messages
byte[] mMsgBuf = new byte[2];

public void onCreate(Bundle savedInstanceState) {
    enableDebugLog(ENABLE_DEBUG, TAG);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // set up a click listener for everything we care about
    for (int id : CLICKABLES) {
        findViewById(id).setOnClickListener(this);
    }
}

/**
 * Called by the base class (BaseGameActivity) when sign-in has failed. For
 * example, because the user hasn't authenticated yet. We react to this by
 * showing the sign-in button.
 */
@Override
public void onSignInFailed() {
    Log.d(TAG, "Sign-in failed.");
    switchToScreen(R.id.screen_sign_in);
}

/**
 * Called by the base class (BaseGameActivity) when sign-in succeeded. We
 * react by going to our main screen.
 */
@Override
public void onSignInSucceeded() {
    Log.d(TAG, "Sign-in succeeded.");

    // register listener so we are notified if we receive an invitation to play
    // while we are in the game
    Games.Invitations.registerInvitationListener(getApiClient(), this);

    // if we received an invite via notification, accept it; otherwise, go to main screen
    if (getInvitationId() != null) {
        acceptInviteToRoom(getInvitationId());
        return;
    }
    switchToMainScreen();
}

@Override
public void onClick(View v) {
    Intent intent;

    switch (v.getId()) {
        case R.id.button_single_player:
        case R.id.button_single_player_2:
            // play a single-player game
            resetGameVars();
            startGame(false);
            break;
        case R.id.button_sign_in:
            // user wants to sign in
            if (!verifyPlaceholderIdsReplaced()) {
                showAlert("Error: sample not set up correctly. Please see README.");
                return;
            }
            beginUserInitiatedSignIn();
            break;
        case R.id.button_sign_out:
            // user wants to sign out
            signOut();
            switchToScreen(R.id.screen_sign_in);
            break;
        case R.id.button_invite_players:

            intent = Games.RealTimeMultiplayer.getSelectOpponentsIntent(getApiClient(), 1, 3);
            switchToScreen(R.id.screen_wait);
            startActivityForResult(intent, RC_SELECT_PLAYERS);
            break;
        case R.id.button_see_invitations:
            // show list of pending invitations
            intent = Games.Invitations.getInvitationInboxIntent(getApiClient());
            switchToScreen(R.id.screen_wait);
            startActivityForResult(intent, RC_INVITATION_INBOX);
            break;
        case R.id.button_accept_popup_invitation:

            acceptInviteToRoom(mIncomingInvitationId);
            mIncomingInvitationId = null;
            break;
        case R.id.button_quick_game:

            startQuickGame();
            break;
        case R.id.button_click_me:

            scoreOnePoint();
            break;
    }
}

void startQuickGame() {

    final int MIN_OPPONENTS = 1, MAX_OPPONENTS = 1;
    Bundle autoMatchCriteria = RoomConfig.createAutoMatchCriteria(MIN_OPPONENTS,
            MAX_OPPONENTS, 0);
    RoomConfig.Builder rtmConfigBuilder = RoomConfig.builder(this);
    rtmConfigBuilder.setMessageReceivedListener(this);
    rtmConfigBuilder.setRoomStatusUpdateListener(this);
    rtmConfigBuilder.setAutoMatchCriteria(autoMatchCriteria);
    switchToScreen(R.id.screen_wait);
    keepScreenOn();
    resetGameVars();
    Games.RealTimeMultiplayer.create(getApiClient(), rtmConfigBuilder.build());
}

@Override
public void onActivityResult(int requestCode, int responseCode,
        Intent intent) {
    super.onActivityResult(requestCode, responseCode, intent);

    switch (requestCode) {
        case RC_SELECT_PLAYERS:

            handleSelectPlayersResult(responseCode, intent);
            break;
        case RC_INVITATION_INBOX:

            handleInvitationInboxResult(responseCode, intent);
            break;
        case RC_WAITING_ROOM:
            // we got the result from the "waiting room" UI.
            if (responseCode == Activity.RESULT_OK) {
                // ready to start playing
                Log.d(TAG, "Starting game (waiting room returned OK).");
                startGame(true);
            } else if (responseCode == GamesActivityResultCodes.RESULT_LEFT_ROOM) {
                // player indicated that they want to leave the room
                leaveRoom();
            } else if (responseCode == Activity.RESULT_CANCELED) {

                leaveRoom();
            }
            break;
    }
}

// Handle the result of the "Select players UI" we launched when the user clicked the
// "Invite friends" button. We react by creating a room with those players.
private void handleSelectPlayersResult(int response, Intent data) {
    if (response != Activity.RESULT_OK) {
        Log.w(TAG, "*** select players UI cancelled, " + response);
        switchToMainScreen();
        return;
    }

    Log.d(TAG, "Select players UI succeeded.");

    // get the invitee list
    final ArrayList<String> invitees = data.getStringArrayListExtra(Games.EXTRA_PLAYER_IDS);
    Log.d(TAG, "Invitee count: " + invitees.size());

    // get the automatch criteria
    Bundle autoMatchCriteria = null;
    int minAutoMatchPlayers = data.getIntExtra(Multiplayer.EXTRA_MIN_AUTOMATCH_PLAYERS, 0);
    int maxAutoMatchPlayers = data.getIntExtra(Multiplayer.EXTRA_MAX_AUTOMATCH_PLAYERS, 0);
    if (minAutoMatchPlayers > 0 || maxAutoMatchPlayers > 0) {
        autoMatchCriteria = RoomConfig.createAutoMatchCriteria(
                minAutoMatchPlayers, maxAutoMatchPlayers, 0);
        Log.d(TAG, "Automatch criteria: " + autoMatchCriteria);
    }

    // create the room
    Log.d(TAG, "Creating room...");
    RoomConfig.Builder rtmConfigBuilder = RoomConfig.builder(this);
    rtmConfigBuilder.addPlayersToInvite(invitees);
    rtmConfigBuilder.setMessageReceivedListener(this);
    rtmConfigBuilder.setRoomStatusUpdateListener(this);
    if (autoMatchCriteria != null) {
        rtmConfigBuilder.setAutoMatchCriteria(autoMatchCriteria);
    }
    switchToScreen(R.id.screen_wait);
    keepScreenOn();
    resetGameVars();
    Games.RealTimeMultiplayer.create(getApiClient(), rtmConfigBuilder.build());
    Log.d(TAG, "Room created, waiting for it to be ready...");
}

// Handle the result of the invitation inbox UI, where the player can pick an invitation
// to accept. We react by accepting the selected invitation, if any.
private void handleInvitationInboxResult(int response, Intent data) {
    if (response != Activity.RESULT_OK) {
        Log.w(TAG, "*** invitation inbox UI cancelled, " + response);
        switchToMainScreen();
        return;
    }

    Log.d(TAG, "Invitation inbox UI succeeded.");
    Invitation inv = data.getExtras().getParcelable(Multiplayer.EXTRA_INVITATION);

    // accept invitation
    acceptInviteToRoom(inv.getInvitationId());
}

// 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(getApiClient(), roomConfigBuilder.build());
}

// Activity is going to the background. We have to leave the current room.
@Override
public void onStop() {
    Log.d(TAG, "**** got onStop");

    // if we're in a room, leave it.
    leaveRoom();

    // stop trying to keep the screen on
    stopKeepingScreenOn();

    switchToScreen(R.id.screen_wait);
    super.onStop();
}

@Override
public void onStart() {
    switchToScreen(R.id.screen_wait);
    super.onStart();
}

// Handle back key to make sure we cleanly leave a game if we are in the middle of one
@Override
public boolean onKeyDown(int keyCode, KeyEvent e) {
    if (keyCode == KeyEvent.KEYCODE_BACK && mCurScreen == R.id.screen_game) {
        leaveRoom();
        return true;
    }
    return super.onKeyDown(keyCode, e);
}

// Leave the room.
void leaveRoom() {
    Log.d(TAG, "Leaving room.");
    mSecondsLeft = 0;
    stopKeepingScreenOn();
    if (mRoomId != null) {
        Games.RealTimeMultiplayer.leave(getApiClient(), this, mRoomId);
        mRoomId = null;
        switchToScreen(R.id.screen_wait);
    } else {
        switchToMainScreen();
    }
}


void showWaitingRoom(Room room) {

    final int MIN_PLAYERS = Integer.MAX_VALUE;
    Intent i = Games.RealTimeMultiplayer.getWaitingRoomIntent(getApiClient(), room, MIN_PLAYERS);

    // show waiting room UI
    startActivityForResult(i, RC_WAITING_ROOM);
}

// Called when we get an invitation to play a game. We react by showing that to the user.
@Override
public void onInvitationReceived(Invitation invitation) {

    mIncomingInvitationId = invitation.getInvitationId();
    ((TextView) findViewById(R.id.incoming_invitation_text)).setText(
            invitation.getInviter().getDisplayName() + " " +
                    getString(R.string.is_inviting_you));
    switchToScreen(mCurScreen); // This will show the invitation popup
}

@Override
public void onInvitationRemoved(String invitationId) {
    if (mIncomingInvitationId.equals(invitationId)) {
        mIncomingInvitationId = null;
        switchToScreen(mCurScreen); // This will hide the invitation popup
    }
}

/*
 * CALLBACKS SECTION. This section shows how we implement the several games
 * API callbacks.
 */


@Override
public void onConnectedToRoom(Room room) {
    Log.d(TAG, "onConnectedToRoom.");

    // get room ID, participants and my ID:
    mRoomId = room.getRoomId();
    mParticipants = room.getParticipants();
    mMyId = room.getParticipantId(Games.Players.getCurrentPlayerId(getApiClient()));

    // print out the list of participants (for debug purposes)
    Log.d(TAG, "Room ID: " + mRoomId);
    Log.d(TAG, "My ID " + mMyId);
    Log.d(TAG, "<< CONNECTED TO ROOM>>");
}


@Override
public void onLeftRoom(int statusCode, String roomId) {
    // we have left the room; return to main screen.
    Log.d(TAG, "onLeftRoom, code " + statusCode);
    switchToMainScreen();
}

// Called when we get disconnected from the room. We return to the main screen.
@Override
public void onDisconnectedFromRoom(Room room) {
    mRoomId = null;
    showGameError();
}

// Show error message about game being cancelled and return to main screen.
void showGameError() {
    showAlert(getString(R.string.game_problem));
    switchToMainScreen();
}

// Called when room has been created
@Override
public void onRoomCreated(int statusCode, Room room) {
    Log.d(TAG, "onRoomCreated(" + statusCode + ", " + room + ")");
    if (statusCode != GamesStatusCodes.STATUS_OK) {
        Log.e(TAG, "*** Error: onRoomCreated, status " + statusCode);
        showGameError();
        return;
    }

    // show the waiting room UI
    showWaitingRoom(room);
}

// Called when room is fully connected.
@Override
public void onRoomConnected(int statusCode, Room room) {
    Log.d(TAG, "onRoomConnected(" + statusCode + ", " + room + ")");
    if (statusCode != GamesStatusCodes.STATUS_OK) {
        Log.e(TAG, "*** Error: onRoomConnected, status " + statusCode);
        showGameError();
        return;
    }
    updateRoom(room);
}

@Override
public void onJoinedRoom(int statusCode, Room room) {
    Log.d(TAG, "onJoinedRoom(" + statusCode + ", " + room + ")");
    if (statusCode != GamesStatusCodes.STATUS_OK) {
        Log.e(TAG, "*** Error: onRoomConnected, status " + statusCode);
        showGameError();
        return;
    }

    // show the waiting room UI
    showWaitingRoom(room);
}


@Override
public void onPeerDeclined(Room room, List<String> arg1) {
    updateRoom(room);
}

@Override
public void onPeerInvitedToRoom(Room room, List<String> arg1) {
    updateRoom(room);
}

@Override
public void onP2PDisconnected(String participant) {
}

@Override
public void onP2PConnected(String participant) {
}

@Override
public void onPeerJoined(Room room, List<String> arg1) {
    updateRoom(room);
}

@Override
public void onPeerLeft(Room room, List<String> peersWhoLeft) {
    updateRoom(room);
}

@Override
public void onRoomAutoMatching(Room room) {
    updateRoom(room);
}

@Override
public void onRoomConnecting(Room room) {
    updateRoom(room);
}

@Override
public void onPeersConnected(Room room, List<String> peers) {
    updateRoom(room);
}

@Override
public void onPeersDisconnected(Room room, List<String> peers) {
    updateRoom(room);
}

void updateRoom(Room room) {
    if (room != null) {
        mParticipants = room.getParticipants();
    }
    if (mParticipants != null) {
        updatePeerScoresDisplay();
    }
}

/*
 * GAME LOGIC SECTION. Methods that implement the game's rules.
 */

// Current state of the game:
int mSecondsLeft = -1; // how long until the game ends (seconds)
final static int GAME_DURATION = 20; // game duration, seconds.
int mScore = 0; // user's current score

// Reset game variables in preparation for a new game.
void resetGameVars() {
    mSecondsLeft = GAME_DURATION;
    mScore = 0;
    mParticipantScore.clear();
    mFinishedParticipants.clear();
}

// Start the gameplay phase of the game.
void startGame(boolean multiplayer) {
    mMultiplayer = multiplayer;
    updateScoreDisplay();
    broadcastScore(false);
    switchToScreen(R.id.screen_game);

    findViewById(R.id.button_click_me).setVisibility(View.VISIBLE);

    // run the gameTick() method every second to update the game.
    final Handler h = new Handler();
    h.postDelayed(new Runnable() {
        @Override
        public void run() {
            if (mSecondsLeft <= 0)
                return;
            gameTick();
            h.postDelayed(this, 1000);
        }
    }, 1000);
}

// Game tick -- update countdown, check if game ended.
void gameTick() {
    if (mSecondsLeft > 0)
        --mSecondsLeft;

    // update countdown
    ((TextView) findViewById(R.id.countdown)).setText("0:" +
            (mSecondsLeft < 10 ? "0" : "") + String.valueOf(mSecondsLeft));

    if (mSecondsLeft <= 0) {
        // finish game
        findViewById(R.id.button_click_me).setVisibility(View.GONE);
        broadcastScore(true);
    }
}

// indicates the player scored one point
void scoreOnePoint() {
    if (mSecondsLeft <= 0)
        return; // too late!
    ++mScore;
    updateScoreDisplay();
    updatePeerScoresDisplay();

    // broadcast our new score to our peers
    broadcastScore(false);
}

/*
 * COMMUNICATIONS SECTION. Methods that implement the game's network
 * protocol.
 */


Map<String, Integer> mParticipantScore = new HashMap<String, Integer>();

Set<String> mFinishedParticipants = new HashSet<String>();

@Override
public void onRealTimeMessageReceived(RealTimeMessage rtm) {
    byte[] buf = rtm.getMessageData();
    String sender = rtm.getSenderParticipantId();
    Log.d(TAG, "Message received: " + (char) buf[0] + "/" + (int) buf[1]);

    if (buf[0] == 'F' || buf[0] == 'U') {
        // score update.
        int existingScore = mParticipantScore.containsKey(sender) ?
                mParticipantScore.get(sender) : 0;
        int thisScore = (int) buf[1];
        if (thisScore > existingScore) {

            mParticipantScore.put(sender, thisScore);
        }

        // update the scores on the screen
        updatePeerScoresDisplay();


        if ((char) buf[0] == 'F') {
            mFinishedParticipants.add(rtm.getSenderParticipantId());
        }
    }
}

// Broadcast my score to everybody else.
void broadcastScore(boolean finalScore) {
    if (!mMultiplayer)
        return; // playing single-player mode

    mMsgBuf[0] = (byte) (finalScore ? 'F' : 'U');

    mMsgBuf[1] = (byte) mScore;

    for (Participant p : mParticipants) {
        if (p.getParticipantId().equals(mMyId))
            continue;
        if (p.getStatus() != Participant.STATUS_JOINED)
            continue;
        if (finalScore) {

            Games.RealTimeMultiplayer.sendReliableMessage(getApiClient(), null, mMsgBuf,
                    mRoomId, p.getParticipantId());
        } else {

            Games.RealTimeMultiplayer.sendUnreliableMessage(getApiClient(), mMsgBuf, mRoomId,
                    p.getParticipantId());
        }
    }
}

/*
 * UI SECTION. Methods that implement the game's UI.
 */


final static int[] CLICKABLES = {
        R.id.button_accept_popup_invitation, R.id.button_invite_players,
        R.id.button_quick_game, R.id.button_see_invitations, R.id.button_sign_in,
        R.id.button_sign_out, R.id.button_click_me, R.id.button_single_player,
        R.id.button_single_player_2
};

// This array lists all the individual screens our game has.
final static int[] SCREENS = {
        R.id.screen_game, R.id.screen_main, R.id.screen_sign_in,
        R.id.screen_wait
};
int mCurScreen = -1;

void switchToScreen(int screenId) {
    // make the requested screen visible; hide all others.
    for (int id : SCREENS) {
        findViewById(id).setVisibility(screenId == id ? View.VISIBLE : View.GONE);
    }
    mCurScreen = screenId;

    // should we show the invitation popup?
    boolean showInvPopup;
    if (mIncomingInvitationId == null) {
        // no invitation, so no popup
        showInvPopup = false;
    } else if (mMultiplayer) {
        // if in multiplayer, only show invitation on main screen
        showInvPopup = (mCurScreen == R.id.screen_main);
    } else {
        // single-player: show on main screen and gameplay screen
        showInvPopup = (mCurScreen == R.id.screen_main || mCurScreen == R.id.screen_game);
    }
    findViewById(R.id.invitation_popup).setVisibility(showInvPopup ? View.VISIBLE : View.GONE);
}

void switchToMainScreen() {
    switchToScreen(isSignedIn() ? R.id.screen_main : R.id.screen_sign_in);
}

// updates the label that shows my score
void updateScoreDisplay() {
    ((TextView) findViewById(R.id.my_score)).setText(formatScore(mScore));
}

// formats a score as a three-digit number
String formatScore(int i) {
    if (i < 0)
        i = 0;
    String s = String.valueOf(i);
    return s.length() == 1 ? "00" + s : s.length() == 2 ? "0" + s : s;
}

// updates the screen with the scores from our peers
void updatePeerScoresDisplay() {
    ((TextView) findViewById(R.id.score0)).setText(formatScore(mScore) + " - Me");
    int[] arr = {
            R.id.score1, R.id.score2, R.id.score3
    };
    int i = 0;

    if (mRoomId != null) {
        for (Participant p : mParticipants) {
            String pid = p.getParticipantId();
            if (pid.equals(mMyId))
                continue;
            if (p.getStatus() != Participant.STATUS_JOINED)
                continue;
            int score = mParticipantScore.containsKey(pid) ? mParticipantScore.get(pid) : 0;
            ((TextView) findViewById(arr[i])).setText(formatScore(score) + " - " +
                    p.getDisplayName());
            ++i;
        }
    }

    for (; i < arr.length; ++i) {
        ((TextView) findViewById(arr[i])).setText("");
    }
}

/*
 * MISC SECTION. Miscellaneous methods.
 */


boolean verifyPlaceholderIdsReplaced() {
    final boolean CHECK_PKGNAME = true; // set to false to disable check
                                        // (not recommended!)


    if (CHECK_PKGNAME && getPackageName().startsWith("com.google.example.")) {
        Log.e(TAG, "*** Sample setup problem: " +
            "package name cannot be com.google.example.*. Use your own " +
            "package name.");
        return false;
    }

    // Did the developer forget to replace a placeholder ID?
    int res_ids[] = new int[] {
            R.string.app_id
    };
    for (int i : res_ids) {
        if (getString(i).equalsIgnoreCase("ReplaceMe")) {
            Log.e(TAG, "*** Sample setup problem: You must replace all " +
                "placeholder IDs in the ids.xml file by your project's IDs.");
            return false;
        }
    }
    return true;
}


void keepScreenOn() {
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

// Clears the flag that keeps the screen on.
void stopKeepingScreenOn() {
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
}

然后是logcat:

 06-14 01:03:35.431: W/BaseGameActivity(15864): BaseGameActivity.enabledDebugLog(bool,String) is deprecated. Use enableDebugLog(boolean)
06-14 01:03:35.431: D/GameHelper(15864): GameHelper: Debug log enabled.
06-14 01:03:35.431: D/GameHelper(15864): GameHelper: Setup: requested clients: 1
06-14 01:03:35.461: W/PopupManager(15864): You have not specified a View to use as content view for popups. Falling back to the Activity content view which may not work properly in future versions of the API. Use setViewForPopups() to set your content view.
06-14 01:03:35.561: D/GameHelper(15864): GameHelper: onStart
06-14 01:03:35.561: D/GameHelper(15864): GameHelper: Connecting client.
06-14 01:03:35.631: D/libEGL(15864): loaded /system/lib/egl/libEGL_adreno200.so
06-14 01:03:35.631: D/libEGL(15864): loaded /system/lib/egl/libGLESv1_CM_adreno200.so
06-14 01:03:35.641: D/libEGL(15864): loaded /system/lib/egl/libGLESv2_adreno200.so
06-14 01:03:35.641: I/Adreno200-EGL(15864): <qeglDrvAPI_eglInitialize:265>: EGL 1.4 QUALCOMM build:  (CL3544079)
06-14 01:03:35.641: I/Adreno200-EGL(15864): Build Date: 03/28/13 Thu
06-14 01:03:35.641: I/Adreno200-EGL(15864): Local Branch: adreno_20130328
06-14 01:03:35.641: I/Adreno200-EGL(15864): Remote Branch: 
06-14 01:03:35.641: I/Adreno200-EGL(15864): Local Patches: 
06-14 01:03:35.641: I/Adreno200-EGL(15864): Reconstruct Branch: 
06-14 01:03:35.721: D/OpenGLRenderer(15864): Enabling debug mode 0
06-14 01:03:36.462: D/AndroidRuntime(15864): Shutting down VM
06-14 01:03:36.462: W/dalvikvm(15864): threadid=1: thread exiting with uncaught exception (group=0x4147dac8)
06-14 01:03:36.462: E/AndroidRuntime(15864): FATAL EXCEPTION: main
06-14 01:03:36.462: E/AndroidRuntime(15864): java.lang.IllegalStateException: A fatal developer error has occurred. Check the logs for further information.
06-14 01:03:36.462: E/AndroidRuntime(15864):    at com.google.android.gms.internal.ff$h.b(Unknown Source)
06-14 01:03:36.462: E/AndroidRuntime(15864):    at com.google.android.gms.internal.ff$h.a(Unknown Source)
06-14 01:03:36.462: E/AndroidRuntime(15864):    at com.google.android.gms.internal.ff$b.eN(Unknown Source)
06-14 01:03:36.462: E/AndroidRuntime(15864):    at com.google.android.gms.internal.ff$a.handleMessage(Unknown Source)
06-14 01:03:36.462: E/AndroidRuntime(15864):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-14 01:03:36.462: E/AndroidRuntime(15864):    at android.os.Looper.loop(Looper.java:137)
06-14 01:03:36.462: E/AndroidRuntime(15864):    at android.app.ActivityThread.main(ActivityThread.java:5293)
06-14 01:03:36.462: E/AndroidRuntime(15864):    at java.lang.reflect.Method.invokeNative(Native Method)
06-14 01:03:36.462: E/AndroidRuntime(15864):    at java.lang.reflect.Method.invoke(Method.java:511)
06-14 01:03:36.462: E/AndroidRuntime(15864):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
06-14 01:03:36.462: E/AndroidRuntime(15864):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
06-14 01:03:36.462: E/AndroidRuntime(15864):    at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
06-14 01:03:36.462: E/AndroidRuntime(15864):    at dalvik.system.NativeStart.main(Native Method)
06-14 01:03:58.624: I/Process(15864): Sending signal. PID: 15864 SIG: 9

0 个答案:

没有答案