Tableless

Busca Menu

Login com a API do GooglePlus no Android.

Seja o primeiro a comentar por

Temos uma opção bastante útil hoje em dia no Android, que é usar a sincronização da conta de e-mail do Google.
Não vou alongar muito a introdução, vamos partir para a codificação e configuração da API.

Criando um novo Projeto no AndroidStudio

1

Digite o nome da aplicação e escolha também um nome do package, vamos precisar para ativar a API do GooglePlus no Console do Google. Continuei a criação e escolha uma Empty Activity.

Configuração no Console do Google e Ativação da API

Tenho que informar que essa é a parte mais chata do tutorial, mas enfim com pouco de paciência e atenção vamos conseguir.
Acesse o link para configurar Console Configuração. Você irá ver algo parecido com isso:

c1

  1. Adicione o nome para a sua aplicação (Sugiro que seja o mesmo nome que Adicionou no seu App).
  2. Adicione o nome do package (Você pode encontrar esse nome no seu AndroidManisfest.xml ou no seu Gradle app-level escrito applicationId).
  3. Escolha sua Região.
  4. Continue (Choose and configure services).

Feito, vai ser redirecionado a uma página e irar visualizar um campo vazio, lá você vai digitar o seu SHA-1. Porém como obter meu SHA-1? Você vai ter que acessar via linha de comando a pasta (.android) normalmente ela fica localizada na raiz  (C:\Users\NomeUsuario\.android)  dentro você vai perceber um arquivo (chave chamada debug.keystore ), quando achar digite o seguinte comando na pasta:

keytool -list -v -keystore debug.keystore -alias androiddebugkey -storepass android -keypass android

cmd

Caso você não consiga acesse o link para mais informações obter SHA-1. Agora copie e cole o SHA-1 no Console do Google e você terá algo:

c3

Agora continue (Continue to Generate configuration files). Gere o arquivo, faça o download depois copie e cole na raiz do seu projeto exemplo (C:\Users\Alessandro\AndroidstudioProjects\GoogleSign-In\app\).

Sem títulooo

Voltando para nosso Projeto no AndroidStudio

Feito as devidas configurações no Console do Google, vamos configurar o Build Gradle o suporte Play Services na nossa aplicação.

1. Adicione a dependência no project-level build.gradle:

classpath 'com.google.gms:google-services:1.5.0-beta2'

2. Adicione o plugin e dependência no app-level build.gradle e o Play services Auth:

apply plugin: 'com.google.gms.google-services'
compile 'com.google.android.gms:play-services-auth:8.3.0'

teste

Arquivo de Layout

No arquivo de layout activity_main.xml adicione:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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"
    tools:context="barreto.alessandro.googlesign_in.MainActivity"
    android:orientation="vertical">

    <RelativeLayout
        android:padding="10dp"
        android:background="#1f737373"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:src="@mipmap/ic_launcher"
            android:id="@+id/ivUsuario"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_centerHorizontal="true" />

        <TextView
            android:layout_marginTop="8dp"
            android:text="Android Teste"
            android:layout_centerHorizontal="true"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:layout_below="@+id/ivUsuario"
            android:id="@+id/tvNome"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:layout_marginTop="5dp"
            android:layout_centerHorizontal="true"
            android:layout_below="@+id/tvNome"
            android:text="androidteste@gmail.com"
            android:id="@+id/tvEmail"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"/>

    </RelativeLayout>

    <LinearLayout
        android:orientation="vertical"
        android:layout_marginTop="16dp"
        android:layout_gravity="center_horizontal"
        android:padding="16dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <com.google.android.gms.common.SignInButton
            android:id="@+id/sign_in_button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/btnDesconectar"
            android:layout_marginTop="10dp"
            android:text="Desconectar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/btnRevogar"
            android:layout_marginTop="10dp"
            android:text="Revogar acesso"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>
</LinearLayout>

Sem muito comentário sobre o código acima, ele possui:

  • Um ImageView para imagem do usuário.
  • Dois TextView para nome e e-mail.
  • Três Buttons sendo que um customizado, vão servir para Login, Desconectar, Revogar o Acesso do usuário

A Class Principal

Agora vamos fazer o vinculo entre o XML e Java API (bindViews). Crie um método chamado bindViews e adicione:

    /**
     * Metodo para fazer o vinculo entre o xml e java api
     */
    private void bindViews(){
        ivUsuario       = (ImageView)findViewById(R.id.ivUsuario);
        tvNome          = (TextView)findViewById(R.id.tvNome);
        tvEmail         = (TextView)findViewById(R.id.tvEmail);
        btnDesconectar  = (Button)findViewById(R.id.btnDesconectar);
        btnRevogar      = (Button)findViewById(R.id.btnRevogar);
        signInButton    = (SignInButton) findViewById(R.id.sign_in_button);
        // litener de clicks
        signInButton.setOnClickListener(this);
        btnDesconectar.setOnClickListener(this);
        btnRevogar.setOnClickListener(this);
    }

Vamos solicitar da API informações simples de um login como nome, e-mail, foto e id, no momento é o que necessitamos para esse exemplo.
Temos que utilizar o objeto GoogleSignOptions e passar como parâmetro GoogleSignOptions.DEFAULT_SIGN_IN nele contem a opção requestEmail().

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail()
                .build();

Agora que já temos configurado nossa solicitação, iremos criar um objeto GoogleApiClient com acesso ao login do Google API e as opções especificadas. Colocando tudo em um método que chamei de obterConfiguracoesPadraoLogin() .

 /**
     * Metodo para fazer as primeiras requisições da API para login simples
     */
    private void obterConfiguracoesPadraoLogin(){
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail()
                .build();

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this,this)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .build();

    }

Agora a intenção de login usando uma Intent do Android com o método getSignInIntent e passando para o startActivityForResult.

    /**
     * metodo para inicar o login
     */
    private void signIn() {
        Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
        startActivityForResult(signInIntent, SIGN_IN);
    }

	@Override
	public void onClick(View v) {
	    switch (v.getId()) {
	        case R.id.sign_in_button:
	            signIn();
	            break;
	        // ...
	    }
	}

Apos isso o método onActivityResult será chamado com nossos resultados e para recuperar utilizamos o getSignInResultFromIntent.

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == SIGN_IN) {
            GoogleSignInResult resultado = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            if (resultado.isSuccess()){
                GoogleSignInAccount acct = resultado.getSignInAccount();
                obterInfoGoogle(acct);
            }
        }
    }

Depois de recuperar o resultado, você pode verificar se a solicitação  deu certo com o método isSuccess . Se bem-sucedido, você pode chamar o método getSignInAccount para obter um objeto GoogleSignInAccount que contém informações sobre o usuário.

    private void obterInfoGoogle(GoogleSignInAccount acct){
        String nome = acct.getDisplayName();
        tvNome.setText(nome);
        String email = acct.getEmail();
        tvEmail.setText(email);
        String id = acct.getId();
        Log.i(TAG,"ID do usuário no GooglePlus "+id);
        String urlFoto = acct.getPhotoUrl().toString();
        Picasso.with(MainActivity.this).load(urlFoto).resize(100,100).into(ivUsuario);
    }

Utilizei a lib Picasso para o carregamento eficiente de imagem, adicione no seu Gradle app-level.

compile 'com.squareup.picasso:picasso:2.5.2'

No AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/>

.Agora segue toda a Class MainActivity

package barreto.alessandro.googlesign_in;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.google.android.gms.auth.api.Auth;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.auth.api.signin.GoogleSignInResult;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.squareup.picasso.Picasso;

public class MainActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener, View.OnClickListener {

    private static final String TAG = "TAG";
    private static final int SIGN_IN = 10;

    private ImageView ivUsuario;
    private TextView tvNome,tvEmail;
    private Button btnDesconectar,btnRevogar;
    private SignInButton signInButton;

    private GoogleApiClient mGoogleApiClient;

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

        bindViews();
        obterConfiguracoesPadraoLogin();

    }

    /**
     * Metodo para fazer o vinculo entre o xml e java api
     */
    private void bindViews(){
        ivUsuario       = (ImageView)findViewById(R.id.ivUsuario);
        tvNome          = (TextView)findViewById(R.id.tvNome);
        tvEmail         = (TextView)findViewById(R.id.tvEmail);
        btnDesconectar  = (Button)findViewById(R.id.btnDesconectar);
        btnRevogar      = (Button)findViewById(R.id.btnRevogar);
        signInButton    = (SignInButton) findViewById(R.id.sign_in_button);
        // litener de clicks
        signInButton.setOnClickListener(this);
        btnDesconectar.setOnClickListener(this);
        btnRevogar.setOnClickListener(this);
    }

    /**
     * Metodo para fazer as primeiras requisições da API para login simples
     */
    private void obterConfiguracoesPadraoLogin(){
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail()
                .build();

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this,this)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .build();

    }

    /**
     * metodo para inicar o login
     */
    private void signIn() {
        Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
        startActivityForResult(signInIntent, SIGN_IN);
    }
    

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == SIGN_IN) {
            GoogleSignInResult resultado = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            if (resultado.isSuccess()){
                GoogleSignInAccount acct = resultado.getSignInAccount();
                obterInfoGoogle(acct);
            }
        }
    }

    private void obterInfoGoogle(GoogleSignInAccount acct){
        String nome = acct.getDisplayName();
        tvNome.setText(nome);
        String email = acct.getEmail();
        tvEmail.setText(email);
        String id = acct.getId();
        Log.i(TAG,"ID do usuário no GooglePlus "+id);
        String urlFoto = acct.getPhotoUrl().toString();
        Picasso.with(MainActivity.this).load(urlFoto).resize(100,100).into(ivUsuario);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.sign_in_button:
                signIn();
                break;
            case R.id.btnDesconectar:
                break;
            case R.id.btnRevogar:
                break;
        }
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.e(TAG,"onConnectionFailed "+connectionResult.getErrorMessage());
    }

}

Falta ainda fazer o desconectar e revogar acesso, estou deixando para próxima parte, até lá.

Publicado no dia