title: Android application trying to implement login via Google plus shows strange system error
body: <p>I am trying to login via Google plus in my application, however i am getting very strange error and which i have searched almost everywhere and everything regarding the same, but no luck. Below is my Code where the implementation is been done. The logcat is showing the system error of java.lang.IllegalArgumentException: GoogleApiClient parameter is required</p>
  
  <p>MainActivity.java</p>
  
  <pre><code>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 &amp;&amp; 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 &amp;&amp; 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;
      }
  }
  
  }
  </code></pre>
  
  <p>Logcat:</p>
  
  <pre><code>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)
  </code></pre>