Desenvolvendo App DroidNew Hello World

Neste Post iremos desenvolver nosso primeiro aplicativo para plataforma Android. Levando em consideração que toda linguagem de programação que você estudar, o primeiro exercício ou exemplo a ser realizado é o famoso Hello World, não seria diferente conosco.

Nosso primeiro aplicativo será o app DroidNew Hello World, o qual já esta disponível no Google Play para download.

O app DroidNew Hello World tem como funcionalidade apresentar uma mensagem na tela principal do aplicativo e ainda disponibilizar uma ação, para realizar acesso ao Blog DroidNew.

Conceitos apresentados nesta aplicação:

  • Layouts
  •  Widgets
  • Eventos
  • Arquivo strings.xml
  • Application Resource
  • Internet
  • Arquivo AndroidManifest

Para construir um Projeto Android podemos utilizar o comando CTRL+N ou navegar ate o menu File New > Others.

01

Selecione Android Application Project e clique em Next.

02

A seguinte tela será apresentada, New Android Application.

03

Aqui você ira selecionar e inserir as cofigurações desejadas para seu projeto, como Application Name (Nome da Aplicação), Project Name (Nome do Projeto), Package Name (Pacote da Aplicação), Buid SDK (Versão que ira rodar a Aplicação), Minimun Required (Versão mínima da Aplicação).

Depois de preencher corretamente os campos, clique em Next.

Caso você insira algum valor incorreto ou a sua configuração não seja valida, a IDE nao ira permitir que voce crie o Projeto.

A proxima tela, Configure Launcher Icon, é a tela de configuração do ícone de nosso aplicativo. Podemos utilizar o padrão, que é carregado de acordo com a versão do aplicativo selecionado no Build (da tela anterior) ou configura-lo do nosso modo.

05

Caso você queira alterar a imagem do ícone, a Google recomenda utilizar uma imagem de extensão .png com dimensões 72×72. No nosso caso, alteramos somente a forma ao redor do ícone, utilizando a opção None e centralizamos a imagem com a opção Center. Iremos alterar a imagem através do arquivo AndroidManifest, mais adiante. Em seguida clique em Next.

A próxima tela, Create Activity, permite criar a Activity e o Layout principal do aplicativo, vamos optar por não cria-los automaticamente, como será nosso primeiro aplicativo, vamos começar do modo clássico. Para isso desmarque a opção Create Activity, em seguida clique em Finish.

06

Pronto nosso projeto foi gerado, agora repare na estrutura da nossa futura aplicação.

07

Existem vários folders, algumas classes, arquivos e um pacote. Esta estrutura faz parte de uma aplicação Android. Vamos descrever seus principais componentes:

  • SRC: Folder que contem todas as Classes Java da Aplicação, geradas por nos desenvolvedores. Essas classes são organizadas por Packages (Pacotes).
  • GEN: Folder que contem todas as Classes Java da Aplicação, geradas automaticamente pelo SDK. Classes como a Classe R e a Classe BuildConfig. Pelo fato de serem classes geradas automaticamente pelo SDK, não podemos altera-las ou excluí-las, mesmo porque se excluirmos elas serão geradas novamente.
    • Classe R.java: Contem o mapeio de todas as constantes de acesso aos recursos da aplicação.
    • Classe BuildConfig.java: Contem configurações internar da aplicação
    • ASSETS: Folder que contem arquivos extras, como .html, .text, etc.
    • BIN: Folder Build da aplicação. Este diretório contem um .APK da aplicação que esta sendo desenvolvida.
    • LIBS: Folder que contem todas as Bibliotecas utilizadas pela aplicação
    • RES: Folder que contem todos os recursos da aplicação.
      • DRAWABLE (HDPI, LDPI, MDPI, XHDPI): Folder que contem todos os arquivos de imagens de extensão .png, .jpg e .gif da aplicação.
      • LAYOUT: Folder que contem todos os Layouts .xml da aplicação.
      • VALUES (V11, V14): Folder que contem todos os arquivos .xml da aplicação, utilizados para internacionalização da mesma, ou seja, são arquivos utilizados pelo Layout em diversos idiomas.
      • AndroidManifest: Arquivo .xml onde declaramos todas as configurações da aplicação. Configurações como Permissions (Permissões), Activitys (Atividades), Services, BroadCast, versão da API e da Aplicação, etc. A configuração incorreta deste arquivo, não permite o funcionamento da aplicação, em alguns casos ate mesmo na instalação. Dependendo da configuração do arquivo AndroidManifest, conhecido como Manifesto, ate mesmo na hora de publicar seu aplicativo, o Google Play ira barrar a publicação, devido à configuração invalida do mesmo.

Dando continuidade na construção do App DroidNew Hello World vamos dar inicio a criação de Layouts, telas da aplicação.

O aplicativo a ser desenvolvido terá somente um layout. Como assim somente um Layout?

O nosso app terá uma única tela, a tela de Hello Wolrd, porem este layout deve se adaptar de acordo com a orientação do aparelho, ou seja, teremos dois layouts, um para a orientação retrato/portrait e outro para a orientação paisagem/landscape.

Cada layout deve estar armazenado em seu respectivo diretório, todos dentro do Folder RES, conforme imagem abaixo.

17

No desenvolvimento de aplicativos Android, podemos utilizar uma estrutura/padrão de Folders, possibilitando aumentar a quantidade de resoluções que nosso aplicativo poderá alcançar, sendo assim, conseguimos configurar o layout de acordo com cada resolução/tamanho.

A seguir, uma tabela com padrões de Folders, que serão identificados pelo dispositivo Android, invocando corretamente cada layout referente à resolução/tamanho do dispositivo, o qual esta executando a aplicação.

Nome

Layout

Orientação

Dimensão

Resultado
layout

layout

Orientação Retrato Tamanho Normal
layout-port

layout

port

Orientação Retrato Tamanho Normal
layout-port-hdpi

layout

port

hdpi

Orientação Retrato Tamanho Normal
layout-port-ldpi

layout

port

ldpi

Orientação Retrato Tamanho Pequeno
layout-port-mdpi

layout

port

mdpi

Orientação Retrato Tamanho Grande
layout-port-xhdpi

layout

port

xhdpi

Orientação Retrato Tamanho Extra Grande
layout-land

layout

land

Orientação Paisagem Tamanho Normal
layout-land-hdpi

layout

land

hdpi

Orientação Paisagem Tamanho Normal
layout-land-ldpi

layout

land

ldpi

Orientação Paisagem Tamanho Pequeno
layout-land-mdpi

layout

land

mdpi

Orientação Paisagem Tamanho Grande
layout-land-xhdpi

layout

land

xhdpi

Orientação Paisagem Tamanho Extra Grande

Em nosso primeiro aplicativo, iremos utilizar dois Folders referentes à tabela anterior, o Folder layout-port e o Folder layout-land, ambos devem estar dentro do Folder RES.

Nota: Você pode perceber, que por padrão, nossa aplicação quando criada possui somente o folder layout. Nós desenvolvedores é quem deve criar os folders necessários para aplicação que esta sendo desenvolvida. Para construir nossos folders, utilize o comando CTRL+N ou navegue ate o menu File New > Others > Folders > Aponte para o diretório RES e inclua o nome do folder > Finish.

Para construir um layout podemos utilizar o comando CTRL+N ou navegar ate o menu File New > Others.

01

Selecione Android layout XML file e clique em Next.

Captura de Tela 2013-12-09 às 21.47.28

A seguinte tela será apresentada, New Android Layout XML File.

Captura de Tela 2013-12-09 às 21.48.46

Aqui você ira selecionar e insira as cofigurações desejadas para seu layout, como File (Nome do layout), Project (Nome do Projeto), Root Element (Estrutura Principal do layout).

Depois de configurado clique em Next > Finish.

Nosso layout foi criado e será apresentado no Modo Designer automaticamente, aguarde. Podemos visualiza-lo no modo Source também, onde temos acesso ao código fonte.

Modo designer

Captura de Tela 2013-12-09 às 21.49.13

Modo Source

Captura de Tela 2013-12-09 às 21.51.40

Para a construção do nosso layout utilizamos:

  • LinearLayout;
  • Imageview;
  • TextView;

Podemos criar nosso layout através do mecanismo de arrastar e soltar (drop and drag) ou programar diretamente pelo nosso código fonte.

Segue layout main.xml em Modo Designer:

Captura de Tela 2013-12-09 às 21.53.03

Este é o codigo fonte do layout main.xml. O arquivo main.xml deve estar armazenado nos dois folders que criamos, layout-port e layout-land.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
<ImageView
android:id="@+id/imageViewDroidNewIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="50dp"
android:src="@drawable/android_icon" />
<TextView
android:id="@+id/textViewDroidNew"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:text="@string/app_helloworld"
android:textAppearance="?android:attr/textAppearanceLarge"/>
</LinearLayout>

A Tag  <LinearLayout> representa a estrutura na qual os nossos componentes serão organizados no layout,  no caso serão organizados um embaixo do outro. Depois temos a tag <ImageView> responsável por inserir uma imagem em nosso layout, repare na instrução android:src=”drawable/android_icon”, ela indica qual imagem armazenada em nosso folder drawable será utilizada. A Tag <TextView> ira apresentar um texto em nosso layout, repare na instrução android:text=”@string/app_helloworld” , nosso TextView esta utilizando uma variável string declarada no arquivo string.xml, armazenado no folder values.

Pronto, depois de desenvolver nosso layout, vamos criar uma Activity que será responsável por apresentar e controlar os componentes deste layout.

Em Android, Activity tem papel importante em toda utilização e execução do aplicativo. Toda Activity que você criar, será uma subclasse (extends) da Classe Activity do Android, esta classe será responsável por ligar a interface apresentada ao usuário (layout) com as funções que a aplicação ira propor.

No Post Introdução ao Android apresentamos algumas características da plataforma Android, uma delas estava relacionada ao gerenciamento das aplicações executadas no dispositivo. O Android tem o poder de pausar, reiniciar e finalizar uma aplicação, caso seja necessário. Isso acontece devido a todos as Atividades serem gerenciadas como uma pilha de atividades em execução.

Sabemos que toda Activity possui um ciclo de vida, tendo inicio, meio e fim. Caso seja necessário o Android poderá pausa ou finalizar uma Activity que estava sendo executada. Essas Activity fazem parte de uma aplicação Android, ou seja, um aplicativo Android é um conjunto de uma ou mais Activity, que são gerenciadas pelo Android, e que possui um Ciclo de Vida. Ciclo este considerado muito importante, abaixo podemos identificar os vários estados que uma Activity pode se encontrar, durante o seu Ciclo de Vida.

activity_lifecycle

Durante alguns estados, pode ser que sua Activity perca o foco e se torne invisível para o usuário. Apresentamos os estados de uma Activity onde os estados são representados por métodos:

public class MainActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
}

Cada método representa um estado:

  • onCreate() – invocado quando uma Activity é criada
  • onStart() – invocado após o onCreate() e antes da Activity se tomar visível para o usuário.
  • onResume() – invocado após o onStart() e se torna visível para o usuário.
  • onPause() – invocado após o onResume() e Activity esta prestes a perder visibilidade para o usuário.
  • onStop()Activity não esta mais visível para o usuário.
  • onRestart()Activity é reiniciada.
  • onDestroy()Activity é destruída.

Para construir uma Activity podemos utilizar o comando CTRL+N ou navegar ate o menu File New > Others.

01

Selecione Class e clique em Next.

Captura de Tela 2013-12-09 às 22.00.42

A seguinte tela será apresentada, New Java Class.

Captura de Tela 2013-12-09 às 22.01.01

Aqui você ira selecionar e inserir as cofigurações desejadas para sua Class, como Name (Nome da Classe), Source Folder (Diretório SRC do Projeto), Package (Pacote da Aplicação).

Depois de preencher corretamente os campos, clique em Finish.

Nossa Class foi criada e será apresentado automaticamente, aguarde.

Captura de Tela 2013-12-09 às 22.01.14

O que acabamos de fazer, foi criar uma classe comum em Java. Repare no nosso diretório, onde ela esta localizada.

17

Agora iremos torna-la em uma Activity, fazendo-a estender a classe do Activity do Android.

public class MainActivity extends Activity

Agora pode sobrescrever os métodos de Activity na Subclasse MainActivity. O método mais utilizado, e o único necessário para este post, é o método onCreate(). Lembrando que o método onCreate(), faz parte do ciclo de vida da Activity, logo iremos manipular o estado de criação da Activiy.

public class MainActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
}

Agora vamos declarar o layout da nossa Atividade MainActivity, para isso iremos invocar o método setContentView(int layout) da Superclasse Activity, passando nosso layout como argumento.

Como podemos ligar nossa atividade MainActivity a um layout  e seus componentes (widgets)?

Através da classe R, responsável por conter todo o mapeio e controle dos recursos da aplicação. Você pode, por curiosidade, abrir a classe R e verificar que cada componente da nossa aplicação, como imagem, layout, string, widget, style, entre outros, contem um código do tipo primitivo int com modificador de acesso static final, que pelo universo Java significa que eles são constantes. Porem nunca altere manualmente a classe R. A cada alteração realizada, ela será gerada automaticamente pelo SDK.

public final class R {
public static final class attr {
}
public static final class drawable {
public static final int android_icon=0x7f020000;
}
public static final class id {
public static final int imageViewDroidNewIcon=0x7f060000;
public static final int textViewDroidNew=0x7f060001;
}
public static final class layout {
public static final int main=0x7f030000;
}
public static final class string {
public static final int app_helloworld=0x7f040001;
public static final int app_name=0x7f040000;
}
public static final class style {
public static final int AppBaseTheme=0x7f050000;
public static final int AppTheme=0x7f050001;
}
}

Sabemos então que temos uma classe, a qual é responsável por realizar a ligação entre Activitys e Layouts. Então nada mais justo importar (import) a classe R. Tome cuidado para não importar a classe R padrão do Android (veremos nos próximos post), temos que importar a classe R pertencente ao nosso projeto.

import com.droidnew.droidnewhelloworld.R;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends Activity{
private ImageView imageViewDroidNewIcon;
private TextView textViewDroidNew;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}

Bom, se executar nossa aplicação deste modo, ela não ira compilar pelo fato que não alteramos nos arquivo AndroidManifest.

Agora vamos criar em nossa Activity as variáveis responsáveis por representar os widgets adicionados em nosso layout. Faremos uso também da classe R, agora passando os valores para o método findViewById(int id).

import com.droidnew.droidnewhelloworld.R;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends Activity{
private ImageView imageViewDroidNewIcon;
private TextView textViewDroidNew;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageViewDroidNewIcon=(ImageView) findViewById(R.id.imageViewDroidNewIcon);
textViewDroidNew=(TextView) findViewById(R.id.textViewDroidNew);
}
}

Depois do layout e seus componentes, vamos criar os eventos dos nossos componentes. No inicio do post, informamos que nosso aplicativo teria um evento para acessar a pagina web do Blog DroidNew. Este evento será executado sempre que o usuário pressionar sobre a área do ImageView e do TextView, ambos adicionados em nosso layout e já conectados á nossa classe MainActivity.

import com.droidnew.droidnewhelloworld.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends Activity{
private ImageView imageViewDroidNewIcon;
private TextView textViewDroidNew;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageViewDroidNewIcon=(ImageView) findViewById(R.id.imageViewDroidNewIcon);
textViewDroidNew=(TextView) findViewById(R.id.textViewDroidNew);
imageViewDroidNewIcon.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// Executar quando usuario pressionar imageViewDroidNewIcon
}
});
textViewDroidNew.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// Executar quando usuario pressionar textViewDroidNew
}
});
}
}

Agora o método responsável por acessar o Blog DroidNew. Sabemos que tudo em Android é uma atividade, e para acessar uma atividade, mesmo que seja de outra aplicação, devemos informar ao Android qual é a nossa intenção. Sendo assim, criamos uma Intent, que terá a intenção de invocar uma atividade caracterizada como uma atividade que será apresentada visualmente ao usuário, Intent.ACTION_VIEW, informando também a URL do Blog. Não se esqueça de invocar o método startActivity(Intent intent), passando a nossa Intent como argumento.

private void acessaSiteDroidNew(){
String url="http://droidnew.com/";
Uri uri=Uri.parse(url);
Intent intent=new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}

Feito isso, o Android se torna responsável por determinar qual atividade ira assumir o controle daqui pra frente, caso exista mais de uma atividade com as características informadas pela nossa Intent, o Android ira listar todas as Atividades que podemos utilizar para executar nossa Intent. Isso pode ocorre, por exemplo, se você tiver dois Browsers instalados em seu dispositivo.

Captura dhomeàs 21.47.30

Nossa classe MainActivity deve ficar assim:

package com.droidnew.droidnewhelloworld.activity;
import com.droidnew.droidnewhelloworld.R;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends Activity{
private ImageView imageViewDroidNewIcon;
private TextView textViewDroidNew;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageViewDroidNewIcon=(ImageView) findViewById(R.id.imageViewDroidNewIcon);
textViewDroidNew=(TextView) findViewById(R.id.textViewDroidNew);
imageViewDroidNewIcon.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
acessaSiteDroidNew();
}
});
textViewDroidNew.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
acessaSiteDroidNew();
}
});
}
private void acessaSiteDroidNew(){
String url="http://droidnew.com/";
Uri uri=Uri.parse(url);
Intent intent=new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
}

Agora só falta configura nosso arquivo AndroidManifest.
Captura de Tela 2013-12-09 às 22.06.17

O AndroidManifest é o arquivo fundamental para o funcionamento de todas as aplicações da plataforma Android. Antes do Android iniciar um componente de aplicação, ele precisa saber se este componente existe, lendo o arquivo AndroidManifest.

Dentro do Manifesto podemos:

  • Identificar as permissões de usuário que o aplicativo requer, como acesso a Internet.
  • Declarar o nível de API mínimo que o aplicativo requer.
  • Declarar os recursos de hardware e software, como câmera, GPS e sensores.
  • Declarar as APIs de Bibliotecas que o aplicativo requer, como o Google Maps.

Selecione a aba AndroidManifest.xml

Captura de Tela 2013-12-09 às 22.06.56

Por padrão o Manifesto é gerado deste modo:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.droidnew.droidnewhelloworld"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@drawable/android_icon"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:logo="@drawable/android_icon">
</application>
</manifest>

Precisamos declarar nossa Activity dentro da Tag Application do arquivo Manifesto. Nossa Tag Activity deve conter uma Tag Intent, pois nossa Activity tem a intenção de realizar alguma atividade. Dentro de nossa Tag Intent inserimos mais duas Tags, Action e Category. A tag Action é utilizada somente para primeira atividade de uma determinada aplicação. Já a tag Category informa a categoria que esta atividade se enquadra.

Nosso AndroidManifest deve ficar assim:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.droidnew.droidnewhelloworld"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<uses-permission
android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@drawable/android_icon"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:logo="@drawable/android_icon">
<activity android:name=".activity.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>

Pronto, nosso primeiro aplicativo foi finalizado.

Vamos executa-lo para conferir o resultado. No Eclipse clique com o botão direito do mouse sobre o projeto na aba Package Explorer ou na aba Project Explorer > Run As > Android Application.

13

A seguinte tela será apresentada, Android Device Chooser.

14

Aqui você ira selecionar onde executar a aplicação, escolha entre um emulador AVD ou um dispositivo Android conectado ao computador e clique em OK.

Acompanhe pelo console do Eclipse o upload, instalação e inicio da aplicação.

16

Nossa aplicação sendo executado.

Home land Home port Web land Web port

Bom, com isso chegamos ao fim de mais um post, esperamos ter ajudado em apresentar alguns conhecimentos sobre Android neste post.

André Luiz

Links úteis para curiosidades, informações, downloads e muito mais:

Eclipse: http://www.eclipse.org/downloads/

SDK e ADT: http://developer.android.com/sdk/

Pagina direta SDK: http://developer.android.com/sdk/index

Pagina Direta ADT: http://developer.android.com/tools/sdk/eclipse-adt.html

Java JDK: http://www.oracle.com/technetwork/pt/java/javase/downloads/

Google Play : https://play.google.com/store?hl=pt_BR

Google Play Droidnew: https://play.google.com/store/apps/developer?id=Andr%C3%A9%20Luiz&hl=pt_BR

Android Developer: http://developer.android.com/

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s