segunda-feira, 11 de janeiro de 2010

Android: Passando objetos em Intents

Olá povo,

Algumas pessoas me perguntaram como passar objetos entre telas no Android ao invés de passar apenas primitivos. Um exemplo típico é uma tela que lista algum tipo de informação e quando algum item dessa lista é selecionado, o objeto da classe referente aquela informação deveria ser passado para uma tela de detalhes do mesmo.

Para resolver isso, eu passava para a tela de detalhamento apenas um identificador do objeto (um código, por exemplo) e lá eu fazia uma consulta ao controlador que me retornava o objeto desejado.

Essa é uma abordagem boa, e até aconselho. Mas quem quiser mesmo passar obejtos entre telas podemos utilizar a interface android.os.Parcelable. A classe que implementar essa interface pode ser adicionada a uma Intent.

Vamos fazer um pequeno exemplo aqui criando uma classe Cliente com dois atributos (código e nome) e ela implementará a interface Parcelable.
import android.os.Parcel;
import android.os.Parcelable;

public class Cliente implements Parcelable {
 private int codigo;
 private String nome;

 public Cliente(int codigo, String nome) {
   this.codigo = codigo;
   this.nome = nome;
 }

 private Cliente(Parcel p){
   codigo = from.readInt();
   nome = from.readString();
 }

 public static final Parcelable.Creator<Cliente>
   CREATOR = new Parcelable.Creator<Cliente>() {

   public Cliente createFromParcel(Parcel in) {
     return new Cliente(in);
   }

   public Cliente[] newArray(int size) {
     return new Cliente[size];
   }
 };

 public int getCodigo() {
   return codigo;
 }

 public void setCodigo(int codigo) {
   this.codigo = codigo;
 }

 public String getNome() {
   return nome;
 }

 public void setNome(String nome) {
   this.nome = nome;
 }

 @Override
 public int describeContents() {
   return 0;
 }

 @Override
 public void writeToParcel(Parcel dest, int flags) {
   dest.writeInt(codigo);
   dest.writeString(nome); 
 }
}
Vejam que a classe Cliente implementa a interface Parcelable que tem dois métodos que devem ser implementados: writeToParcel e describeContents. O primeiro método serve para serializar as informações da classe, já o segundo é um inteiro qualquer que identifica a classe :)

A segunda coisa importante a destacar é o atributo estático CREATOR que é do tipo Parcelable.Creator. Segundo a própria documentação, todas as classes que desejem implementar Parcelable devem ter essa variável. É ela que cria os objetos a partir de um Parcel, classe que a grosso modo, junta as funcionalidades de um DataInputStream e DataOutputStream para serializar e deserializar objetos. Veja que ela chama o construtor privado de Cliente que recebe um Parcel que nos permite ler dados dele e passando para os atributos.
Agora vamos ver como passar nosso objeto via Intent:
Cliente cliente = new Cliente(1, "Glauber");

Intent it = new Intent(this, Teste2Activity.class);
   
it.putExtra("cliente", cliente);
   
startActivity(it);
E para ler o conteúdo é tão simples quando enviar:
Cliente c = 
  getIntent().getExtras().getParcelable("cliente");

EDITADO em 08/08/2012:
Achei uma maneira muuuito mais simples (porém mais lenta em tempo de execução) de fazer a passagem de objetos entre Activities. Basta fazer com que eles implementem a interface java.io.Serializable.
public class Pessoa implements Serializable {
  // Seus atributos, gets e sets ...
}
Dessa forma você pode passar os objetos da classe Pessoa para outras activities via Intent normalmente, inclusive adicionando-os a listas (a classe ArrayList é serializada).
 
ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>();
pessoas.add(new Pessoa(1, "Glauber"));
pessoas.add(new Pessoa(2, "Nelson"));
        
Intent it = new Intent(this, Tela2Activity.class);
// passando a lista
it.putExtra("pessoas", pessoas); 
// passando um objeto
it.putExtra("pessoa", pessoas.get(0)); 
startActivity(it);


E pra recuperar:
Pessoa pessoa = 
  (Pessoa) getIntent().getSerializableExtra("pessoa");

ArrayList<Pessoa> pessoas = (ArrayList<Pessoa>) 
  getIntent().getSerializableExtra("pessoas");
  
System.out.println("Pessoa: "+ pessoa.getNome());
System.out.println(
  "Pessoas: "+ pessoas.get(0).getNome());

4br4ç05,
nglauber

sábado, 2 de janeiro de 2010

Mac OS X Leopard no PC

Olá povo,

Desde 2005 quando Apple começou a utilizar a plataforma Intel em seus computadores o projeto OSX86 criou o Hackintosh, que consiste na alteração do sistema operacional da Apple para executar em PCs comuns. Isso se deve ao fato de que o hardware, diferentemente do que era no passado é bem similar ao do PC convencional.

Hoje, o que impede que um PC execute o Mac OS X vendido pela Apple é o fato de o sistema operacional ser homologado para um hardware específico, ou seja, ele não tem os drivers do hardware de vários modelos/fabricantes que são utilizados em um PC comum. Já o Hackintosh disponibiliza os drivers e o kernel que permitem essa execução em um PC comum. Assim como o Linux, o Hackintosh também tem distribuições, as mais conhecidas são a iATKOS, iDeneb, Kalyway e Leo4All.

Nesse post, vou mostrar como eu instalei o hackintosh no meu notebook, e falar dos problemas que tive e tenho. Quero deixar claro aos que quiserem se aventurar que você deve conhecer bem a marca e o modelo de cada componente do seu hardware e que o uma distribuição pode ser melhor para um tipo de hardware do que para outro.

Legalidade

Segundo o site Olhar Digital a utilização do Hackintosh não é ilegal. Desde que você tenha comprado uma versão do Mac OS X Original que custa R$79,00.
No entanto quero reiterar que a instalação que fiz foi apenas para fins educacionais e que não me resposabilizo por nada que der errado no seu PC :)

O computador


Requisitos

O primeiro e mais importante deles: PACIÊNCIA. Eu tive que tentar várias vezes até conseguir uma instalação bem sucedida. Então, vá com calma gafanhoto :)

É aconselhável estar com outro computador por perto para tirar as dúvidas e resolver os problemas que você venha a ter.

Utilizei a versão iATKOS 7. Infelizmente não tenho o link, mas baixei via torrent aproximadamente 3.6GB

Após baixar a imagem, grave-a no em um DVD (eu utilizei o Nero) em uma velocidade baixa (2 ou 4x) para evitar problemas de leitura.

O processo

Coloque o DVD no driver.

Configure na BIOS do seu computador para dar o boot pelo driver de DVD.

Quando o computador iniciar, ele pedirá pra pressionar qualquer tecla para iniciar o DVD ou pressionar F8 para mais detalhes. Eu aconselho pressionar F8 e digitar -v e pressionar ENTER isso fará com que o DVD inicie no modo de debug. Assim, caso algum erro ocorra... pesquise na internet como resolver :)

Se tudo correr bem, a interface gráfica será carregada com uma tela cinza com a logo da Apple. Essa tela demora em torno de 3 minutos para desaparecer, depois dela aparecerá uma tela pedindo para clicar no botão pra continuar.

Quando carregar a tela de boas vindas, você precisará criar a partição onde ficará o sistema operacional. Para isso, vá até o menu Utilities | Disc Utilities, lá selecione o seu HD e crie uma partiação Mac OS Extended. Depois de criar a partição, feche o utilitário.

Clique em Continue, abrirá um tela de licença, clique em Agree. Agora o instalador perguntará onde você deseja instalar o OSX, selecione a partição que criamos no passo anterior e clique em continuar.

A tela Install Summary é o passo mais importante. Clique em Customize, nessa tela selecionaremos o que será instalado. Lembrando que isso pode variar de máquina pra máqunia. Abaixo listo o que EU, selecionei (não desmarquei nenhuma opção padrão):
- Bootloader > Chamaleon v2
- X86 Patches > Kernel > 9.7.0 Kernel Vodoo
- Drivers > System > SATA/IDE > VIA SATA/IDE
- Languages > Português > Português
Clique em Done. Voltará para a tela de Install Summary. Clique em Install.

O processo de instalação inciará e demorará cerca de 45 minutos. Quando a barra de progresso chegar ao fim, será exibida uma tela de sucesso e solicitará que o computador seja reinicializado. Quando o computador reiniciar, retire rapidamente o DVD do driver para evitar o boot pelo DVD novamente.

Se tudo correr bem, aparecerá a tela do Chamaleon e o boot do Mac OS iniciará automaticamente. Isso demorará cerca de 2 minutos.

Quando a interface gráfica inciar, para concluir a instalação serão feitas algumas configurações como: localização regional, teclado, se você deseja enviar informações sobre seu Mac (não faça isso :) , seu tipo de conexão com a internet (configure isso depois), informações pessoais (nome, sobrenome, etc), onde você utiliza o Mac, criará a conta (usuário e senha) para acessar o computador, timezone, e por último data e hora.

Se você chegou até aqui, a instalação foi concluída com sucesso e você é um sortudo :)

Abaixo o screenshot do meu Mac :)





Abaixo mais algumas informações...

Problemas Resolvidos

Windows XP e o OS X no mesmo HD em partições diferentes (óbvio): consegui colocando a partição do OS X como a primeira do disco, de outra forma a instalação dava problema ao reiniciar o computador após a instalação.

Dual Boot com o Windows XP: foi simples, bastou instalar o Windows XP em outra partição, depois de ter instalado o Mac OS. Com isso o bootloader do Windows sobrepos o Chamaleon (gerenciador de boot utilizado no OSX86). Depois foi só seguir esse tutorial.

Drivers ausentes: Wireless e Bateria. Não consegui utilizar o driver disponibilizado no site da Realtek. Ao invés disso, baixei um torrent de um CD-PACK com vários drivers, entre eles o driver da minha placa, que funcionou perfeitamente.

A placa de vídeo: a que o OS X detectou suporta apenas a resolução 1024x768. No entanto, seguindo esses links (link1 e link2), dá pra modificar.

Telado ABNT: o teclado do note é o padrão brasileiro, daí eu baixei o Brasileiro.bundle na internet (não lembro de onde) e funcionou. Entretanto a interrogação, que no meu teclado fica entre o Alt e o Ctrl da direita, não funcionou. Daí eu baixei o Spark e criei um atalho para a interrogação.

Problema NÃO Resolvido

Não tive tempo de procurar o driver da placa de rede Wired. É uma SiS, mas não lembro o modelo ao certo.

Programas legais

Para que a mudança pro mundo Mac não seja tão dolorosa, instalei no OSX alguns programas que utilizo com frequência no Windows:

- Eclipse Galileo
- Real VNC
- Microsoft Office
- MSN Messenger
- Android SDK

E por último...

Espero que tenham gostado e que esse post seja últil pra alguém. E se alguém resolver algum dos problemas que citei acima ou tiver alguma sugestão de melhoria mail-me.

4br4ç05,
nglauber

terça-feira, 1 de dezembro de 2009

Acrobat Reader "reads" pra você

Olá povo,

O formato de documentos PDF já está mais do que consolidado no mercado. Artigos, apresentações, e-books, e muitos outros tipos de documentos estão na internet disponibilizados nesse formato.

Para ler esse tipo de documento precisamos de um programinha para interpretá-lo. O mais conhecido deles é o Adobe Acrobat Reader (apesar de haver outros como o Foxit). E ao ler um e-book na minha casa descobri uma funcionalidade desse programinha que eu acho que poucas pessoas conhecem: Ler em voz alta.

Isso mesmo. Essa funcionalidade faz com que o Reader leia o documento pra você :) Para isso, vá ao menu Visualizar / Ler em voz alta. Pronto! Agora só aumentar o som e acompanhar a leitura. Se você achar que ele está lendo muito rápido, vá no menu Editar / Preferências e depois escolha a opção Leitura. Lá você pode diminuir o número de palavras por minuto para tornar a leitura mais lenta.

Fiz esse teste no Windows XP e com a versão 7.0 do Acrobat Reader. Infelizmente essa funcionalidade é apenas para documentos em inglês, em português ele ainda ficou devendo.

4br4ç05,
nglauber

quarta-feira, 25 de novembro de 2009

Palestra sobre Android na Faculdade Guararapes

Olá povo,

Nessa sexta-feira (27/11) às 20:00h estarei na Faculdade dos Guararapes ministrando uma palestra sobre a plataforma Android. Na ocasião, também estaremos divulgando o curso de Android que ministrarei em parceria com a Especializa Treinamentos.

A palestra será aberta ao público externo.

4br4ç05,
nglauber

terça-feira, 17 de novembro de 2009

Android: Personalizando os recursos

Olá povo,

Hoje vou falar um poquinho sobre a parte de recursos do Android. Todos os recursos que usamos na nossa aplicação (strings, imagens, cores, layouts, etc.) ficam dentro da pasta "res". Só que cada subdiretório tem um objetivo específico:

  • res/anim: arquivos XML de animações frame-a-frame ou de efeito;
  • res/drawable: arquivos de imagens da aplicação com as extensões .png, .9.png, .jpg;
  • res/layout: arquivos XML com os layouts de telas;
  • res/values: arquivos XML que podem ter os seguintes elementos: string-array (lista de valores), color (definição de cores), string (texto simples) ou style (estilos aplicados à views).
No entanto nós podemos criar variações desses diretórios dependendo da configuração do aparelho. Por exemplo, podemos criar textos em português e inglês para nossa aplicação. Assim, quando o usuário mudar o idioma o texto da aplicação mudaria automaticamente. No Android, basta fazermos o seguinte:

res/values-pt
res/values-en

Pronto! Coloque os textos em português no primeiro diretório e os em inglês no segundo.

Outra possibilidade é criarmos arquivos de layout para resoluções de tela diferentes, seguindo o mesmo princípio:

res/layout-land
res/layout-854x480
res/layout-land-480x320

Se quisermos fazer um layout retrato (portrait) e outro paisagem (landscape para uma tela podemos utilizar a opção "land". Para ter layouts para diferentes tamanhos de tela, basta colocar a resolução da tela passando a [altura]x[largura]. Já na terceira estamos combinando a opção de landscape + tamanho da tela.

E se quisermos que algo mude na nossa aplicação dependendo da operadora? Existe uma numeração que identifica a operadora. Essa numeração é a MCC (Mobile Country Code) e o MNC (Mobile Network Code). E o Android nos permite identificar isso para que nossa aplicação possa ter um comportamento diferente. Para descobrir o MCC e o MNC da operadora podemos utilizar esse código:

TelephonyManager tel = (TelephonyManager) 
  getSystemService(Context.TELEPHONY_SERVICE);
String networkOperator = tel.getSimOperator();

if (networkOperator != null) {

  int mcc = Integer.parseInt(
    networkOperator.substring(0, 3));

  int mnc = Integer.parseInt(
    networkOperator.substring(3));
}


Com o código da operadora, basta colocar o nas suas pastas mcc123-mnc123 (substitua o 123 pelo número encontrado no código acima).

res/drawable-mcc724-mnc31
res/values-mcc724-mnc02

Na pasta acima 724 é o MCC do Brazil e os valores 31 e 02 são da Oi e TIM respectivamente.

Além dessas opções, temos muitas outras que podemos achar aqui.

Resolvi também colocar um screen-shot só da pasta "res" do projeto que eu estou trabalhando.



Mais informações aqui.

4br54ç05,
nglauber

domingo, 8 de novembro de 2009

Android 2.0 - Lista de Contatos

Olá povo,

Como nós estamos acompanhando, as versões do Android estão saindo com uma velocidade enorme. Mal eu tinha instalado a versão 1.6 e a versão 2.0 tinha saido do forno. Como já tem se tornado comum também, novidades legais têm sido apresentadas. Uma mudança muito forte feita nessa versão foi na parte de contatos, que permite que você adicione várias informações sobre seu contato como e-mail, IM, empresa, notas, etc. No entanto, essas novidades trazem modificações na API. Sendo assim, segue abaixo um código que lista os contatos cadastrados e seus respectivos IDs, e ao clicarmos em um contato da lista, são exibidos os telefones associados.


public class ExemploListaContatos extends ListActivity {

private ListAdapter adaptador;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Obtém os contatos cadastrados utilizando
// a nova classe ContactsContract
Cursor c = getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI,
null, null, null, null);
startManagingCursor(c);

String[] colunas = {
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts._ID};

int[] campos = {
android.R.id.text1,
android.R.id.text2};

adaptador = new SimpleCursorAdapter(
this, android.R.layout.two_line_list_item,
c, colunas, campos);
setListAdapter(adaptador);
}

protected void onListItemClick(ListView l,
View v, int position, long id) {

super.onListItemClick(l, v, position, id);

// Obtém os campos da linha do contato
Cursor c = (Cursor)adaptador.getItem(position);

int contactId = c.getInt(
c.getColumnIndex(ContactsContract.Contacts._ID));

// Obtém os telefones do contato
Cursor phones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,
null, null);

StringBuffer sb = new StringBuffer();
int tipo, resTipo;
String numero;

if (phones.getCount() > 0){
phones.moveToFirst();

// Percorre o cursor para obter
// Os telefones e o tipo
while (!phones.isAfterLast()){

tipo = phones.getInt(
phones.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.TYPE));

numero = phones.getString(
phones.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER));

resTipo = ContactsContract.CommonDataKinds.Phone.getTypeLabelResource(tipo);
sb.append(getString(resTipo) +": "+ numero +"\n");
phones.moveToNext();
}

} else {
sb.append("Nenhum número cadastrado.");
}
Toast.makeText(this, sb.toString(), Toast.LENGTH_SHORT).show();
}
}


Agora é só adicionar a permissão de leitura dos contatos ao AndroidManifest.xml.


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


4br4ç05,
nglauber

terça-feira, 3 de novembro de 2009

Palestra sobre Android em Recife

Olá povo,

Amanhã (04/11) às 16:30 estarei palestrando sobre Android na III Semana de Informática da Universidade Católica de Pernambuco. Na palestra falarei sobre a história do Android, o porque da sua criação, quais as vantagens (e desvantagens) de se adotar esse sistema, alguns exemplos de código Android, etc. Também divulgaremos o curso de Android que ministrarei na Especializa Treinamentos.

Para mais informações, clique aqui e acesse a página do evento.

4br4ç05,
nglauber