Signin with Google+ API - Android
Autor: Felipe Bonezi | Publicado: 2013-03-05T22:15:00-03:00

Uma das apostas do Google neste semestre será a utilização da API do Google+ disponibilizada na API do Google Services.
Antes de tudo, para utilizarmos a API do Google+, precisamos baixar em nosso SDK Manager o Google Play Services que nada mais é do que uma library contendo diversas API criadas pelo pessoal do Google. Depois de baixar, tudo que precisamos fazer é importa-lo para o nosso workspace do Eclipse (O projeto do Google Play Services estará na pasta do SDK do Android).


O que precisamos fazer agora? Cada usuário desenvolvedor Google possui um painel onde são listados os serviços disponíveis para aquela respectiva conta chamado de Google APIs Console. Ao entrar, tenha certeza de ativar a opção do Google+ API.

Depois disso, precisamos criar a sua autenticação OAuth 2.0 Client e selecionar que iremos utiliza-lo através da plataforma Android. Também necessitamos de um SHA-1 Fingerprint que é gerado através do command line:

// O executável do 'keytool' está na pasta do SDK do ANDROID.
keytool -exportcert -alias androiddebugkey -keystore "dir_sdk_android/debug.keystore" -list -v


Pronto, agora podemos partir para a doideira, haha! :)

Para o nosso layout, precisamos apenas de um botão que será o responsável por executar o signin no Google+. Não é segredo que através do nosso Button iremos captar o evento de click realizado pelo usuário.

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/sign_in_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Signin Google+" />




Agora que temos nosso layout criado, precisamos inicializar em nossa Activity a classe PlusClient, disponibilizada na library do Google Play Services.

Basicamente utilizaremos a classe PlusClient para efetuar a comunicação entre nosso app com o Google+ API através de uma conexão que será estabelecida de modo assíncrono.


Também podemos efetuar essa inicialização utilizando o conceito de Ciclo de Vida de uma Activity.



onCreate: Inicializamos o objeto PlusClient através do padrão Builder;
onResume: Executamos a conexão através do método connect() contido no PlusClient;
onPause: Desconectamos através do método disconnect() contido no PlusClient.



Mas como dito anteriormente, neste exemplo iremos utilizar o evento de click para efetuar a conexão!



public class MainActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener, OnClickListener {

 // Intent Error Code
 private static final int INTENT_ERROR = 9000;

 private PlusClient mPlusClient;
 private ConnectionResult mConnectionResult;

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

  // Verificação de disponibilidade do Google+ no aparelho
  int errorCode = GooglePlusUtil.checkGooglePlusApp(this);
  if (errorCode != GooglePlusUtil.SUCCESS) {
   // O aparelho não possui o app do Google+
   GooglePlusUtil.getErrorDialog(errorCode, this, 0).show();
  }

  // Todos os observers estão implementados pela Activity
  PlusClient.Builder builder = new PlusClient.Builder(this, this, this);

  // O Scope LOGIN nos dá capacidade de obter informações da conta
  builder.setScopes(Scopes.PLUS_LOGIN);
  mPlusClient = builder.build();

  findViewById(R.id.sign_in_button).setOnClickListener(this);
 }

 @Override
 public void onClick(View view) {
  if (view.getId() == R.id.sign_in_button) {
   if (!mPlusClient.isConnected()) {
    if (mConnectionResult == null) {
     // Chamada para efetuar conexão
     mPlusClient.connect();
    } else {
     if (mConnectionResult.hasResolution()) {
      try {
       // Recupera as informações da conexão
       mConnectionResult.startResolutionForResult(this, INTENT_ERROR);
      } catch (SendIntentException e) {
       // Nova tentativa de conexão
       mConnectionResult = null;
       mPlusClient.connect();
      }
     }
    }
   } else {
    Toast.makeText(this, "Você já está connectado!",
      Toast.LENGTH_SHORT).show();
   }
  }
 }

 @Override
 protected void onDestroy() {
  super.onDestroy();
  // Chamada para desconectar o PlusClient.
  mPlusClient.disconnect();
 }

 @Override
 public void onConnected() {
  final String accountName = mPlusClient.getAccountName();
  Person me = mPlusClient.getCurrentPerson();
  String aboutMe = me != null ? me.getAboutMe() : "null";
  mPlusClient.loadMoments(new OnMomentsLoadedListener() {

   @Override
   public void onMomentsLoaded(ConnectionResult status,
     MomentBuffer momentBuffer, String nextPageToken,
     String updated) {
    if (status.isSuccess()) {
     for (int i = 0;i < momentBuffer.getCount();i++) {
      Moment moment = momentBuffer.get(i);
      ItemScope item = moment.getResult();
      String description = item.getDescription();
      Log.d("Google+", "Descrição: " + description);
     }
    }
   }
  });
  Toast.makeText(this, accountName + ", sobre você: "
      + aboutMe, Toast.LENGTH_LONG).show();
 }

 @Override
 public void onDisconnected() {
  Toast.makeText(this, "Desconectou do Google+!",
      Toast.LENGTH_LONG).show();
 }

 @Override
 public void onConnectionFailed(ConnectionResult result) {
  if (result.hasResolution()) {
   try {
    // Recupera as informações da falha na conexão
    result.startResolutionForResult(this, INTENT_ERROR);
   } catch (SendIntentException e) {
    // Nova tentativa de conexão
    mPlusClient.connect();
   }
  }
 }

 protected void onActivityResult(int requestCode, int responseCode,
   Intent intent) {
  if (requestCode == INTENT_ERROR
     && responseCode == RESULT_OK) {
   // Nova tentativa de conexão
   mConnectionResult = null;
   mPlusClient.connect();
  }
 }


Lembrando que devemos apenas utilizar o Google+ API a partir do Android 2.x, ou seja, precisamos verificar qual é a versão do S.O. em que o app está sendo rodado. Como podemos fazer isso? SIMPLES!



if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
    // Execute seu código neste trecho...
}


Espero que ajudem todos!
Dúvidas é só entrar em contato,

Abraço.