Android应用程序试图通过Google plus实现登录显示奇怪的系统错误



我试图通过Google plus在我的应用程序登录,但是我得到非常奇怪的错误,我几乎到处都在搜索,一切都是一样的,但没有运气。下面是我的代码,其中实现是完成的。日志显示系统错误java.lang.IllegalArgumentException: GoogleApiClient参数是必需的

MainActivity.java

public class MainActivity extends Activity implements com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks, com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener, OnClickListener, OnAccessRevokedListener{
private static final String TAG = "MainActivity";
// A magic number we will use to know that our sign-in error
// resolution activity has completed.
private static final int OUR_REQUEST_CODE = 49404;
// The core Google+ client.
private PlusClient mPlusClient;

// A flag to stop multiple dialogues appearing for the user.
private boolean mResolveOnFail;
// We can store the connection result from a failed connect()
// attempt in order to make the application feel a bit more
// responsive for the user.
private ConnectionResult mConnectionResult;
// A progress dialog to display when the user is connecting in
// case there is a delay in any of the dialogs being ready.
private ProgressDialog mConnectionProgressDialog;
private GoogleApiClient mGoogleApiClient;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main);

    mPlusClient = new PlusClient.Builder(this, this, this)
            .setActions("http://schemas.google.com/AddActivity",
                    "http://schemas.google.com/BuyActivity")
            .build();
            // We use mResolveOnFail as a flag to say whether we should trigger
            // the resolution of a connectionFailed ConnectionResult.
            mResolveOnFail = false;
            // Connect our sign in, sign out and disconnect buttons.
            findViewById(R.id.sign_in_button).setOnClickListener(this);
            findViewById(R.id.sign_out_button).setOnClickListener(this);
            findViewById(R.id.revoke_access_button).setOnClickListener(this);
            findViewById(R.id.sign_out_button).setVisibility(View.INVISIBLE);
            findViewById(R.id.revoke_access_button).setVisibility(View.INVISIBLE);
            // Configure the ProgressDialog that will be shown if there is a
            // delay in presenting the user with the next sign in step.
            mConnectionProgressDialog = new ProgressDialog(this);
            mConnectionProgressDialog.setMessage("Signing in...");
}
@Override
protected void onStart() {
    super.onStart();
    Log.v(TAG, "Start");
    // Every time we start we want to try to connect. If it
    // succeeds we'll get an onConnected() callback. If it
    // fails we'll get onConnectionFailed(), with a result!
    mPlusClient.connect();
}
@Override
protected void onStop() {
    super.onStop();
    Log.v(TAG, "Stop");
    // It can be a little costly to keep the connection open
    // to Google Play Services, so each time our activity is
    // stopped we should disconnect.
    mPlusClient.disconnect();
}
@Override
public void onConnectionFailed(ConnectionResult result) {
    Log.v(TAG, "ConnectionFailed");
    // Most of the time, the connection will fail with a
    // user resolvable result. We can store that in our
    // mConnectionResult property ready for to be used
    // when the user clicks the sign-in button.
    if (result.hasResolution()) {
        mConnectionResult = result;
        if (mResolveOnFail) {
            // This is a local helper function that starts
            // the resolution of the problem, which may be
            // showing the user an account chooser or similar.
            startResolution();
        }
    }
}
@Override
public void onConnected(Bundle bundle) {
    // Yay! We can get the oAuth 2.0 access token we are using.
    Log.v(TAG, "Connected. Yay!");
    // Turn off the flag, so if the user signs out they'll have to
    // tap to sign in again.
    mResolveOnFail = false;
    // Hide the progress dialog if its showing.
    mConnectionProgressDialog.dismiss();
    // Hide the sign in button, show the sign out buttons.
    findViewById(R.id.sign_in_button).setVisibility(View.INVISIBLE);
    findViewById(R.id.sign_out_button).setVisibility(View.VISIBLE);
    findViewById(R.id.revoke_access_button).setVisibility(View.VISIBLE);
    // Retrieve the oAuth 2.0 access token.
    final Context context = this.getApplicationContext();
    getProfileInformation();
    AsyncTask task = new AsyncTask() {
        @Override
        protected Object doInBackground(Object... params) {
            String scope = "oauth2:" + Scopes.PLUS_LOGIN;
            try {
                // We can retrieve the token to check via
                // tokeninfo or to pass to a service-side
                // application.
                String token = GoogleAuthUtil.getToken(context,
                        mPlusClient.getAccountName(), scope);
            } catch (UserRecoverableAuthException e) {
                // This error is recoverable, so we could fix this
                // by displaying the intent to the user.
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (GoogleAuthException e) {
                e.printStackTrace();
            }
            return null;
        }
    };
    task.execute((Void) null);
}
private void getProfileInformation() {
    try {
        if (Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) != null) {
            Person currentPerson = Plus.PeopleApi
                    .getCurrentPerson(mGoogleApiClient);
            String personName = currentPerson.getDisplayName();
            String personPhotoUrl = currentPerson.getImage().getUrl();
            String personGooglePlusProfile = currentPerson.getUrl();
            String email = Plus.AccountApi.getAccountName(mGoogleApiClient);
            Log.e(TAG, "Name: " + personName + ", plusProfile: "
                    + personGooglePlusProfile + ", email: " + email
                    + ", Image: " + personPhotoUrl);
            txtName.setText(personName);
            txtEmail.setText(email);
            // by default the profile url gives 50x50 px image only
            // we can replace the value with whatever dimension we want by
            // replacing sz=X
            personPhotoUrl = personPhotoUrl.substring(0,
                    personPhotoUrl.length() - 2)
                    + PROFILE_PIC_SIZE;
            new LoadProfileImage(imgProfilePic).execute(personPhotoUrl);
        } else {
            Toast.makeText(getApplicationContext(),
                    "Person information is null", Toast.LENGTH_LONG).show();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
@Override
public void onDisconnected() {
    // Bye!
    Log.v(TAG, "Disconnected. Bye!");
}
protected void onActivityResult(int requestCode, int responseCode,
        Intent intent) {
    Log.v(TAG, "ActivityResult: " + requestCode);
    if (requestCode == OUR_REQUEST_CODE && responseCode == RESULT_OK) {
        // If we have a successful result, we will want to be able to
        // resolve any further errors, so turn on resolution with our
        // flag.
        mResolveOnFail = true;
        mPlusClient.connect();
    } else if (requestCode == OUR_REQUEST_CODE && responseCode != RESULT_OK) {
        mConnectionProgressDialog.dismiss();
    }
}
@Override
public void onClick(View view) {
    switch (view.getId()) {
    case R.id.sign_in_button:
        Log.v(TAG, "Tapped sign in");
        if (!mPlusClient.isConnected()) {
            // Show the dialog as we are now signing in.
            mConnectionProgressDialog.show();
            // Make sure that we will start the resolution (e.g. fire the
            // intent and pop up a dialog for the user) for any errors
            // that come in.
            mResolveOnFail = true;
            // We should always have a connection result ready to resolve,
            // so we can start that process.
            if (mConnectionResult != null) {
                startResolution();
            } else {
                // If we don't have one though, we can start connect in
                // order to retrieve one.
                mPlusClient.connect();
            }
        }
        break;
    case R.id.sign_out_button:
        Log.v(TAG, "Tapped sign out");
        // We only want to sign out if we're connected.
        if (mPlusClient.isConnected()) {
            mPlusClient.clearDefaultAccount();

            mPlusClient.disconnect();
            mPlusClient.connect();
            // Hide the sign out buttons, show the sign in button.
            findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE);
            findViewById(R.id.sign_out_button)
                    .setVisibility(View.INVISIBLE);
            findViewById(R.id.revoke_access_button).setVisibility(
                    View.INVISIBLE);
        }
        break;
    case R.id.revoke_access_button:
        Log.v(TAG, "Tapped disconnect");
        if (mPlusClient.isConnected()) {
            // Clear the default account as in the Sign Out.
            mPlusClient.clearDefaultAccount();
            mPlusClient.revokeAccessAndDisconnect(this);
        }
        break;
    default:
        // Unknown id.
    }
}
@Override
public void onAccessRevoked(ConnectionResult status) {
    mPlusClient.connect();
    // Hide the sign out buttons, show the sign in button.
    findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE);
    findViewById(R.id.sign_out_button).setVisibility(View.INVISIBLE);
    findViewById(R.id.revoke_access_button).setVisibility(View.INVISIBLE);
}
/**
 * A helper method to flip the mResolveOnFail flag and start the resolution
 * of the ConnenctionResult from the failed connect() call.
 */
private void startResolution() {
    try {
        mResolveOnFail = false;
        mConnectionResult.startResolutionForResult(this, OUR_REQUEST_CODE);
    } catch (SendIntentException e) {
        // Any problems, just try to connect() again so we get a new
        // ConnectionResult.
        mPlusClient.connect();
    }
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}
/**
 * A placeholder fragment containing a simple view.
 */
public static class PlaceholderFragment extends Fragment {
    public PlaceholderFragment() {
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container,
                false);
        return rootView;
    }
}
}

Logcat:

java.lang.IllegalArgumentException: GoogleApiClient parameter is required.
at com.google.android.gms.internal.eg.b(Unknown Source)
at com.google.android.gms.plus.Plus.a(Unknown Source)
at com.google.android.gms.internal.ia.getCurrentPerson(Unknown Source)
at com.example.googleplus.MainActivity.getProfileInformation(MainActivity.java:182)
at com.example.googleplus.MainActivity.onConnected(MainActivity.java:153)
at com.google.android.gms.internal.dw$c.onConnected(Unknown Source)
at com.google.android.gms.internal.dx.b(Unknown Source)
at com.google.android.gms.internal.dx.bT(Unknown Source)
at com.google.android.gms.internal.dw$h.b(Unknown Source)
at com.google.android.gms.internal.dw$h.b(Unknown Source)
at com.google.android.gms.internal.dw$b.bR(Unknown Source)
at com.google.android.gms.internal.dw$a.handleMessage(Unknown Source)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3729)
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:874)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:632)
at dalvik.system.NativeStart.main(Native Method)

您从未将mGoogleApiClient设置为任何值。

这取代了旧的PlusClient/GamesClient/AppStateClient/等。客户。您创建一个GoogleApiClient并将其传递给任何API方法。

如果你有mPlusClient = ...你想用

代替它
mGoogleApiClient = new GoogleApiClient.Builder()
    .addApi(Plus.API, new Plus.PlusOptions.Builder()
        .addActivityTypes(
            "http://schemas.google.com/AddActivity",
            "http://schemas.google.com/BuyActivity")
        .build())
    .addConnectionCallbacks(this)
    .addOnConnectionFailedListener(this)
    .build()

删除mPlusClient,使用mGoogleApiClient

最新更新