Pixel do facebook

Para os desenvolvedores que estão começando com Android vamos passar esse código-fonte de um app que analisa as interfaces de rede bem como seus endereços de hardware.

A ideia desse aplicativo é funcionar tanto em smartfone quanto em TVs, portanto quando criar o projeto no Android Studio escolha ao menos o modelo para Android TV.

Como prerrequisitos para avançar nessa leitura é necessário que você conheça a estrutura básica de um aplicativo Android, o essencial da linguagem Java e também saiba criar um projeto no Android Studio.

Estrutura básica do app analisador

O passo a passo básico para esse app é:

  1. Definir as permissões e recursos necessários bem como qual é a classe principal no arquivo AndroidManifest.xml;
  2. Definir a interface gráfica do aplicativo na pasta res/layout;
  3. Definir a classe Java principal do aplicativo.

Permissões e recursos

O arquivo manifests/AndroidManifest.xml contém as declarações de quais permissões e recursos o aplicativo necessita, além de indicar quais são as atividades (activities) de interação do usuário e por isso estamos começando por ele.


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="br.com.belavistaguiase.analisador">
<!-- Este aplicativo precisa de acesso ao estado da rede e à internet -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<!-- Dentre os recursos do sistema estamos permitindo que o app funcione em dispositivos que não são sensíveis ao toque e que a API Leanback destinada à Android TV não é obrigatória. Está especificado também que o aplicativo suporta redimensionamento de tela sem travar -->
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<uses-feature
android:name="android.software.leanback"
android:required="false" />
<!-- Depois de declararmos permissões e recursos entramos nos atributos da aplicação em si. Neste caso dizemos que ela permite backup, qual é o ícone, o recurso string do nome, suporte de escrita e tema Theme.Leanback. -->
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.Leanback">
<!-- O app só tem uma activity, a qual deixamos o nome sugerido pela IDE e com suporte a troca de orientação de tela -->
<activity
android:name=".MainActivity"
android:screenOrientation="sensor"
android:banner="@id/main_image"
android:configChanges="orientation|screenSize|keyboardHidden">
<!-- Filtro que indica que essa é a activity principal a ser disparada quando o app é acionado tanto em um ambiente Andoid TV quanto outro. -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

Interface gráfica do app

Por padrão a interface gráfica de aplicativos Android é definida em arquivo XML sendo que a diferença é grande do desenvolvimento Java padrão porque não existem pacotes swing e awt para isso.
No caso do Analisador nós definimos no arquivo res/layout/main_activity.xml apenas um LinearLayout com um componente ListView e sendo assim – para não ficarem espaços vazios e distorções no leiaute – fizemos esses contêineres preencherem toda a tela especificando os atributos android:layout_width=”match_parent” e android:layout_height=”match_parent”.
<?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">
<ListView
android:id="@+id/lv_interfaces"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>

Classe Java Principal

Finalmente chegamos ao código Java da MainActivity que não tem o famoso “psvm”, clássico dessa linguagem, contudo lembramos que a classe foi declarada no AndroidManifest.xml.

package br.com.belavistaguiase.analisador;
import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Enumeration;
public class MainActivity extends Activity {

/**
* Método chamado quando a activity é iniciada
*
* @param savedInstanceState Parâmetro de reinicialização. Pode ser nulo.
*/
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {

//Remove o título da janela
requestWindowFeature(Window.FEATURE_NO_TITLE);

//Coloca o aplicativo em tela inteira
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

//Esconde a barra de navegação
getWindow().getDecorView().
setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

//Indicamos qual é o id do leiaute a ser inflado/controlado.
setContentView(R.layout.main_activity);

//ArrayList para conter as informações e ser exibido na lista final

ArrayList interfaces = new ArrayList<>();
try {

//A classe NetworkInterface trabalha as informações das interfaces de rede

Enumeration networkInterfaceEnum = NetworkInterface.getNetworkInterfaces();

//Enquanto houverem interfaces para listar...

while (networkInterfaceEnum.hasMoreElements()) {

//... Avance na listagem

NetworkInterface ni = networkInterfaceEnum.nextElement();

/*
* Utilizamos tantas strings apenas para o código ficar mais didático.
* Prefira StringBuilder em um app de produção
*/

//Obtenha o nome

String nomeInterface = ni.getName();
String enderecoInterface = "";

//O endereço de hardware é um array de bytes e deve ser integrado em uma string

if (ni.getHardwareAddress() != null) {
for (int i = 0; i < ni.getHardwareAddress().length; i++) {
enderecoInterface += ni.getHardwareAddress()[i];
}
}

//Pegue o nome de exibição

String nomeExibicaoInterface = ni.getDisplayName();

//Obs: Strings estáticas, em um caso padrão, devem ser declaradas em res/values/strings

String itemLista = "Nome da Interface: " + nomeInterface
+ " | Nome de exibição: " + nomeExibicaoInterface
+ " | Endereço: " + enderecoInterface;

//Adicione o item à lista

interfaces.add(itemLista);

}

//É necessário tratar uma eventual SocketException

} catch (SocketException se) {
se.printStackTrace();
}

/**
* A ListView não pode ser populada diretamente pelo ArrayList, portanto devemos
* declarar o um adaptador que o contenha e indique para o container qual é o contexto,
* o id do leiaute dos itens
*/

ArrayAdapter adapterInterfaces =
new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, interfaces);
ListView lv = findViewById(R.id.lv_interfaces);

//Por fim populamos a ListView com nosso adaptador.
lv.setAdapter(adapterInterfaces);
super.onCreate(savedInstanceState);
}
}

Vai ficar assim:

Interface Gráfica do App Analisador

Baixe o projeto e divirta-se! 🙂

Consiga mais

Agora que compartilhamos com você este tutorial simples mas que te permitirá dar grandes passos no desenvolvimento móvel, leia nosso artigo: Planeje seu aplicativo Android de um jeito simples.