DevCorner: effettuiamo login e post con Google+

Giuseppe Tripodi
Giuseppe Tripodi Tech Master
DevCorner: effettuiamo login e post con Google+

Due settimane fa abbiamo visto come eseguire il login con Facebook e postare sulla bacheca: tuttavia, dai piani alti si sono sentiti molto offesi e hanno minacciato di devastare la redazione con enormi androidi giganti. Per non scontentare nessuno, quindi, vediamo oggi come effettuare il login ed il post con Google+.

Anche questa volta la guida sarà piuttosto lunga ed articolata, ma non perdetevi d'animo perché vi seguiremo passo per passo.

Per prima cosa apriamo Eclipse e creiamo un nuovo progetto: noi, nella nostra estrema mancanza di fantasia, lo abbiamo chiamato GoogleP, voi fate ovviamente come volete.

A questo punto avviamo l'Android SDK Manager (se non avete l'icona a portata di mano, lo trovate sotto il tab Window) e dalla cartella Extra scarichiamo il pacchetto Google Play Services.

Google plus - Extra

NB: Se siete su Linux, potreste incappare in un problema causato dal fatto che Android SDK Manager non ha i permessi sufficienti per creare cartelle nella directory home.

In questo caso, basterà avviarlo come root (l'eseguibile si trova all'interno della cartella tools dell'sdk e ha come nome android). Ricordatevi, successivamente, di impostare i permessi di lettura e scrittura per tutti gli utenti con un chmod -R 777 nomedirectory

Fatto questo, recatevi nella pagina di Google APIs Console e, cliccando dal menu a tendina sotto il logo, create un nuovo progetto.

Create

Scegliete un nome (noi abbiamo messo DevCorner, ma ovviamente va bene tutto) e cliccate su Create Project: verrete rimandati al tab Services, dove dovete attivare il servizio chiamato Google+ APIs.

Google Plus APIs

Fatto questo, cliccate sul tab API Access (lo trovate sulla sinistra) e, successivamente, sul grande bottone blu Create an OAuth 2.0 client ID...: questa sarà la parte più noiosa da configurare, proprio come lo fu due settimane fa la controparte per Facebook.

Create OAuth

Armatevi di un po' di santa pazienza e proseguiamo: nei primi tre campi (Nome, immagine e URL) metteteci pure quello che volete, noi abbiamo chiamato il nostro progetto DevCorner, abbiamo inserito il logo del portale e impostato come home la pagina principale del sito.

Nella schermata successiva scegliete Installed Application e come tipo di applicazione Android: a questo punto inseriamo il nome del pacchetto (com.peppeuz.googlep, per noi) e prepariamoci a perdere un po' di tempo per il Signing Certificate Fingerprint.

Come per Facebook, si tratta di una chiave univoca da generare da terminale: se avete seguito il tutorial per il social network di Zuckerberg e siete riusciti ad ottenere la Key Hash, qui si tratta esattamente della stessa cosa: se ci troviamo su sistemi Unix based (Linux e Mac), quindi, apriamo una shell e digitiamo

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -list -v

mentre su Windows il comando da scrivere sul Prompt dei comandi sarà qualcosa di simile:

keytool -exportcert -alias androiddebugkey -keystore .C:\Documents and Settings\Administrator.android\debug.keystore -list -v

se tutto andrà secondo i piani, il terminale dovrebbe chiedervi una password, che di default è android, e generare successivamente una serie di chiavi, della quale dobbiamo appuntare la SHA1.

Key Hash

Copiamo la chiave SHA1 nel campo Signing Certificate Fingerprint e clicchiamo finalmente Create Client ID.

NB: Questa è un'immagine di esempio di Google

NB: Questa è un'immagine di esempio di Google

Finito di impostare tutto lato Google, possiamo tornare su Eclipse. La prima cosa da fare è importare la libreria di Play Services: per farlo clicchiamo su File - Import - Existing Android Code into Workspace: dalla finestra che si è aperta clicchiamo su Browse e andiamo a trovare la cartella extras all'interno dell'sdk di Android. Qui dovrebbero esserci altre due sottocartelle: entriamo in google e successivamente google_play_services, infine importiamo l'omonima libreria (gli altri progetti sono superfui).

import play services

Una volta aggiunta al nostro Workspace, dobbiamo inserire la libreria all'interno del nostro progetto: per farlo, clicchiamo col tasto destro e scegliamo Properties e successivamente Android: in basso clicchiamo su Add e scegliamo la libreria Play Services.

import google-play-services

Fatto questo abbiamo terminato i preparativi e possiamo definitivamente dedicarci alla nostra applicazione vera e propria. Per prima cosa, impostiamo quanto necessario nell'Android Manifest: apriamolo e, dal tab Permissions, aggiungiamo i seguenti: android.permission.GET_ACCOUNTSandroid.permission.INTERNET.

Definiamo adesso la nostra interfaccia: apriamo l'activity_main.xml e andiamo ad inserire il bottone proprietario di Google+ per il login e altri due tasti per il logout e la condivisione; di questi ultimi, imposteremo la visibilità su Gone in modo che non siano visibili finché l'utente non accede. Il risultato sarà qualcosa del genere:



    

    
    
    

    

Passiamo adesso al codice java della nostra MainActivity: la cosa più importante da fare qui è utilizzare tutti i metodi necessari alla gestione del PlusClient: per questo motivo implementiamo i metodi ConnectionCallbacks, OnConnectionFailedListener OnPersonLoadedListener e definiamo una ProgressDialog, un PlusClient e un ConnectionResult.

Settiamo quanto necessario nell'OnCreate (dove definiamo anche i nostri bottoni) e scriviamo tutti i metodi necessari per gestire il PlusClient. Da notare che nel caso la connessione avvenga correttamente, nel metodo OnConnected abbiamo fatto in modo che venga mostrato un toast con la nostra mail e vengano resi visibili i tasti Logout e Share, nascondendo il Login:

public class MainActivity extends Activity implements OnClickListener,
		ConnectionCallbacks, OnConnectionFailedListener, OnPersonLoadedListener {
	private static final String TAG = "ExampleActivity";
	private static final int REQUEST_CODE_RESOLVE_ERR = 9000;

	private ProgressDialog mConnectionProgressDialog;
	private PlusClient mPlusClient;
	private ConnectionResult mConnectionResult;
	Button logout;
	Button share;
	SignInButton signin;

	@Override
	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		logout = (Button) findViewById(R.id.logout);
		share = (Button) findViewById(R.id.share_button);
		signin = (SignInButton) findViewById(R.id.sign_in_button);
		signin.setOnClickListener(this);
		share.setOnClickListener(this);
		logout.setOnClickListener(this);
		mPlusClient = new PlusClient.Builder(this, this, this)
				.setVisibleActivities("http://schemas.google.com/AddActivity",
						"http://schemas.google.com/BuyActivity").build();
		mConnectionProgressDialog = new ProgressDialog(this);
		mConnectionProgressDialog.setMessage("Signing in...");
	}

	@Override
	protected void onStart() {
		super.onStart();

	}

	@Override
	protected void onStop() {
		super.onStop();
		mPlusClient.disconnect();
	}

	@Override
	public void onConnectionFailed(ConnectionResult result) {
		if (result.hasResolution()) {
			try {
				result.startResolutionForResult(this, REQUEST_CODE_RESOLVE_ERR);
			} catch (SendIntentException e) {
				mPlusClient.connect();
			}
		}
		mConnectionResult = result;
	}

	@Override
	protected void onActivityResult(int requestCode, int responseCode,
			Intent intent) {
		if (requestCode == REQUEST_CODE_RESOLVE_ERR
				&& responseCode == RESULT_OK) {
			mConnectionResult = null;
			mPlusClient.connect();
		}
	}

	@Override
	public void onDisconnected() {
		Log.d(TAG, "disconnected");
	}

	@Override
	public void onConnected(Bundle connectionHint) {
		mConnectionProgressDialog.dismiss();
		Toast.makeText(this,
				"User is connected!" + mPlusClient.getAccountName(),
				Toast.LENGTH_LONG).show();
		mPlusClient.loadPerson(this, "me");
	}

	@Override
	public void onPersonLoaded(ConnectionResult status, Person person) {
		// TODO Auto-generated method stub

		if (status.getErrorCode() == ConnectionResult.SUCCESS) {
			Log.d(TAG, "Display Name: " + person.getDisplayName());
		}

	}

adesso non ci rimane che gestire l'OnClick, facendo in modo che ad ogni clic sui bottoni compia le azioni desiderate: login, logout e condivisione.

Per controllare quale tasto viene cliccato utilizziamo uno switch che va a controllare l'ID della view corrispondente: se viene cliccato il SignInButton di Google+, quindi, vengono avviate le procedure per l'autenticazione (e viene automaticamente richiamato il metodo OnConnect che mostra gli altri due tasti), in caso di Logout l'utente viene disconnesso e ricompare il tasto di Accesso.

Per quanto riguarda le operazioni per la condivisione, è necessario impostare il testo che vogliamo condividere di default (AndroidWorld - DevCorner nel nostro caso) e un url (noi abbiamo inserito il link per questo tutorial). Il nostro OnClick, quindi, avrà un aspetto simile:

@Override
	public void onClick(View view) {
		switch (view.getId()) {
		case R.id.sign_in_button:
			mPlusClient.connect();
			if (!mPlusClient.isConnected()) {
				if (mConnectionResult == null) {
					mConnectionProgressDialog.show();
				} else {
					try {
						mConnectionResult.startResolutionForResult(this,
								REQUEST_CODE_RESOLVE_ERR);
					} catch (SendIntentException e) {
						mConnectionResult = null;
						mPlusClient.connect();
					}
				}

			}
			break;
		case R.id.share_button:

			Intent shareIntent = new PlusShare.Builder(this)
					.setType("text/plain")
					.setText("AndroidWorld - DevCorner")
					.setContentUrl(
							Uri.parse("https://www.androidworld.it/2013/09/17/devcorner-login-post-google-184703"))
					.getIntent();

			startActivityForResult(shareIntent, 0);
			break;

		case R.id.logout:
			
			if (mPlusClient.isConnected()) {
				mPlusClient.clearDefaultAccount();
				mPlusClient.disconnect();
				mPlusClient.connect();
			}
		

			logout.setVisibility(View.GONE);
			signin.setVisibility(View.VISIBLE);
			share.setVisibility(View.GONE);
			break;
		default:
			break;
		}

	}

Dopo tutta questa lunga guida, il risultato finale della nostra MainActivity compreso di import vari, sarà qualcosa molto simile a quanto segue:

package com.peppeuz.googlep;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.IntentSender.SendIntentException;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks;
import com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.plus.PlusClient;
import com.google.android.gms.plus.PlusClient.OnPersonLoadedListener;
import com.google.android.gms.plus.PlusShare;
import com.google.android.gms.plus.model.people.Person;

public class MainActivity extends Activity implements OnClickListener,
		ConnectionCallbacks, OnConnectionFailedListener, OnPersonLoadedListener {
	private static final String TAG = "ExampleActivity";
	private static final int REQUEST_CODE_RESOLVE_ERR = 9000;

	private ProgressDialog mConnectionProgressDialog;
	private PlusClient mPlusClient;
	private ConnectionResult mConnectionResult;
	Button logout;
	Button share;
	SignInButton signin;

	@Override
	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		logout = (Button) findViewById(R.id.logout);
		share = (Button) findViewById(R.id.share_button);
		signin = (SignInButton) findViewById(R.id.sign_in_button);
		signin.setOnClickListener(this);
		share.setOnClickListener(this);
		logout.setOnClickListener(this);
		mPlusClient = new PlusClient.Builder(this, this, this)
				.setVisibleActivities("http://schemas.google.com/AddActivity",
						"http://schemas.google.com/BuyActivity").build();

		mConnectionProgressDialog = new ProgressDialog(this);
		mConnectionProgressDialog.setMessage("Signing in...");
	}

	@Override
	protected void onStart() {
		super.onStart();

	}

	@Override
	protected void onStop() {
		super.onStop();
		mPlusClient.disconnect();
	}

	@Override
	public void onConnectionFailed(ConnectionResult result) {
		if (result.hasResolution()) {
			try {
				result.startResolutionForResult(this, REQUEST_CODE_RESOLVE_ERR);
			} catch (SendIntentException e) {
				mPlusClient.connect();
			}
		}

		mConnectionResult = result;
	}

	@Override
	protected void onActivityResult(int requestCode, int responseCode,
			Intent intent) {
		if (requestCode == REQUEST_CODE_RESOLVE_ERR
				&& responseCode == RESULT_OK) {
			mConnectionResult = null;
			mPlusClient.connect();
		}
	}

	@Override
	public void onDisconnected() {
		Log.d(TAG, "disconnected");
	}

	@Override
	public void onConnected(Bundle connectionHint) {
		mConnectionProgressDialog.dismiss();
		Toast.makeText(this,
				"User is connected! " + mPlusClient.getAccountName(),
				Toast.LENGTH_LONG).show();
		mPlusClient.loadPerson(this, "me");
		signin.setVisibility(View.GONE);
		logout.setVisibility(View.VISIBLE);
		share.setVisibility(View.VISIBLE);
	}

	@Override
	public void onPersonLoaded(ConnectionResult status, Person person) {
		// TODO Auto-generated method stub

		if (status.getErrorCode() == ConnectionResult.SUCCESS) {
			Log.d(TAG, "Display Name: " + person.getDisplayName());
		}

	}

	@Override
	public void onClick(View view) {
		switch (view.getId()) {
		case R.id.sign_in_button:
			mPlusClient.connect();
			if (!mPlusClient.isConnected()) {
				if (mConnectionResult == null) {
					mConnectionProgressDialog.show();
				} else {
					try {
						mConnectionResult.startResolutionForResult(this,
								REQUEST_CODE_RESOLVE_ERR);
					} catch (SendIntentException e) {
						mConnectionResult = null;
						mPlusClient.connect();
					}
				}

			}
			break;
		case R.id.share_button:

			Intent shareIntent = new PlusShare.Builder(this)
					.setType("text/plain")
					.setText("AndroidWorld - DevCorner")
					.setContentUrl(
							Uri.parse("https://www.androidworld.it/2013/09/17/devcorner-login-post-google-184703"))
					.getIntent();

			startActivityForResult(shareIntent, 0);
			break;

		case R.id.logout:
			if (mPlusClient.isConnected()) {
				mPlusClient.clearDefaultAccount();
				mPlusClient.disconnect();
				mPlusClient.connect();
			}

			logout.setVisibility(View.GONE);
			signin.setVisibility(View.VISIBLE);
			share.setVisibility(View.GONE);
			break;
		default:
			break;
		}

	}

}

Anche per questa settimana è tutto: adesso che sapete come utilizzare Google+ sul vostro smartphone potete divertirvi con la condivisione sull'emergente social network di BigG.

Come sempre, nel caso aveste problemi con questa guida o dubbi generali sulla programmazione Android, vi rimandiamo sul nostro forum, dove cercheremo di aiutarvi. Buon sviluppo a tutti!

Via: DevCorner