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.
O passo a passo básico para esse app é:
- Definir as permissões e recursos necessários bem como qual é a classe principal no arquivo AndroidManifest.xml;
- Definir a interface gráfica do aplicativo na pasta res/layout;
- 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
try {
//A classe NetworkInterface trabalha as informações das interfaces de rede
Enumeration
//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
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:
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.