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
terça-feira, 1 de dezembro de 2009
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
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/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:
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
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).
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.
Agora é só adicionar a permissão de leitura dos contatos ao AndroidManifest.xml.
4br4ç05,
nglauber
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
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
domingo, 25 de outubro de 2009
Intents nativas do Android
Olá povo,
Um grande benefício que a plataforma Android trouxe para nós desenvolvedores foi a capacidade de nos comunicar com aplicações "nativas" através de intenções (Intents).
Sendo assim, resolvi publicar algumas das intents nativas mais comuns do Android. Segue abaixo o código-fonte.
Vamos explicar o que foi feito acima. Criamos uma lista com várias opções de intents nativas. E quando o usuário clicar em qualquer uma dessas opções, a respectiva Intent será disparada.
Em todos os casos, utilizamos o objeto Uri para criar a Intent. Esse objeto indica um recurso do aparelho queremos acessar, e baseado no protocolo informado, ele irá disparar a atividade desejada.
Em conjunto com a Uri, associamos uma ação que queremos realizar sobre o recurso. Vamos exemplificar como o Android entende a solicitação, usando o caso do Browser: "O usuário está com a intenção (Intent) de visualizar (ACTION_VIEW) o recurso (Uri) http://nglauber.blogspot.com". Nesse momento o Android faz uma busca interna pra saber quem pode tratar essa intenção.
No exemplo de discar um número, utilizamos a ação ACTION_DIAL e o protocolo "tel:" seguido do número do telefone a ser discado. Notem que aqui há uma diferença entre "discar" (ACTION_DIAL) e "chamar" (ACTION_CALL). A primeira opção apenas disca o número não chama. Se quiséssemos chamar o número ao invés de apenas discá-lo, deveríamos utilizar a ACTION_CALL e adicionar a permissão abaixo no manifest:
Na lista de contatos temos dois casos. O primeiro visualiza um contato utilizando o protocolo "content://" - que identifica um ContentProvider - passando o caminho do provider de contatos. Já o segundo caso está usando a ação ACTION_PICK para recuperar a Uri de um contato específico. Para tal, é utilizado o método startActivityForResult que iniciará a tela de contatos permitindo que selecionemos um da lista. Para tratar o retorno da atividade, utilizamos o método onActivityResult.
Para abrir a aplicação de Mapas em um local específico utilizamos o protocolo "geo:" seguido do do endereço do local desejado. É possível passar também a longitude e latitude (geo:lat,long).
Para executarmos o MP3 Player padrão do aparelho passando uma música, utilizamos o método setDataAndType e passamos a Uri com o protocolo "file://" e informando o MIME type do arquivo.
Mais informações aqui.
4br4ç05,
nglauber
Um grande benefício que a plataforma Android trouxe para nós desenvolvedores foi a capacidade de nos comunicar com aplicações "nativas" através de intenções (Intents).
Sendo assim, resolvi publicar algumas das intents nativas mais comuns do Android. Segue abaixo o código-fonte.
public class ExemploIntents extends ListActivity {
private static final String[] OPCOES = {
"Browser",
"Realizando uma chamada",
"Visualizar contato",
"Todos os contatos",
"Mapa",
"Tocar música",
"SMS",
"Sair"
};
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
ArrayAdapter<String> adapter =
new ArrayAdapter<String>(
this,
android.R.layout.simple_list_item_1,
OPCOES);
setListAdapter(adapter);
}
@Override
protected void onListItemClick(ListView l, View v,
int position, long id) {
super.onListItemClick(l, v, position, id);
Uri uri = null;
Intent intent = null;
switch (position) {
// Abrindo uma URL
case 0:
uri = Uri.parse("http://nglauber.blogspot.com");
intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
break;
// Realiza uma chamada
case 1:
uri = Uri.parse("tel:99887766");
intent = new Intent(Intent.ACTION_DIAL, uri);
startActivity(intent);
break;
// Visualiza um contato específico
// da lista de contatos
case 2:
uri = Uri.parse(
"content://contacts/people/5");
intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
break;
// Visualiza todos os contatos e permite
// selecionar um através do resultado
// da Activity
case 3:
uri = Uri.parse(
"content://contacts/people/");
intent = new Intent(Intent.ACTION_PICK, uri);
startActivityForResult(intent, 0);
break;
// Pesquisa uma posição do mapa
// !Seu AVD deve estar usando Google APIs!
case 4:
uri = Uri.parse(
"geo:0,0?q=Rua+Amelia,Recife");
intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
break;
// Executa uma música do SDcard
case 5:
uri = Uri.parse(
"file:///sdcard/musica.mp3");
intent = new Intent();
intent.setDataAndType(uri,"audio/mp3");
startActivity(intent);
break;
// Abrindo o editor de SMS
case 6:
uri = Uri.parse("sms:12345");
intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra("sms_body", "Corpo do SMS");
startActivity(intent);
break;
default:
finish();
}
}
@Override
protected void onActivityResult(int requestCode,
int resultCode, Intent data) {
super.onActivityResult(requestCode,
resultCode, data);
// Mostra um contato selecionado (case 3)
// em um Toast
if (data == null){
Toast.makeText(this, "Nenhum contato",
Toast.LENGTH_SHORT).show();
} else {
Uri uri = data.getData();
Toast.makeText(this, "Contato: "+ uri,
Toast.LENGTH_SHORT).show();
}
}
}
Vamos explicar o que foi feito acima. Criamos uma lista com várias opções de intents nativas. E quando o usuário clicar em qualquer uma dessas opções, a respectiva Intent será disparada.
Em todos os casos, utilizamos o objeto Uri para criar a Intent. Esse objeto indica um recurso do aparelho queremos acessar, e baseado no protocolo informado, ele irá disparar a atividade desejada.
Em conjunto com a Uri, associamos uma ação que queremos realizar sobre o recurso. Vamos exemplificar como o Android entende a solicitação, usando o caso do Browser: "O usuário está com a intenção (Intent) de visualizar (ACTION_VIEW) o recurso (Uri) http://nglauber.blogspot.com". Nesse momento o Android faz uma busca interna pra saber quem pode tratar essa intenção.
No exemplo de discar um número, utilizamos a ação ACTION_DIAL e o protocolo "tel:" seguido do número do telefone a ser discado. Notem que aqui há uma diferença entre "discar" (ACTION_DIAL) e "chamar" (ACTION_CALL). A primeira opção apenas disca o número não chama. Se quiséssemos chamar o número ao invés de apenas discá-lo, deveríamos utilizar a ACTION_CALL e adicionar a permissão abaixo no manifest:
<uses-permission name="android.permission.CALL_PHONE"/>
Na lista de contatos temos dois casos. O primeiro visualiza um contato utilizando o protocolo "content://" - que identifica um ContentProvider - passando o caminho do provider de contatos. Já o segundo caso está usando a ação ACTION_PICK para recuperar a Uri de um contato específico. Para tal, é utilizado o método startActivityForResult que iniciará a tela de contatos permitindo que selecionemos um da lista. Para tratar o retorno da atividade, utilizamos o método onActivityResult.
Para abrir a aplicação de Mapas em um local específico utilizamos o protocolo "geo:" seguido do do endereço do local desejado. É possível passar também a longitude e latitude (geo:lat,long).
Para executarmos o MP3 Player padrão do aparelho passando uma música, utilizamos o método setDataAndType e passamos a Uri com o protocolo "file://" e informando o MIME type do arquivo.
Mais informações aqui.
4br4ç05,
nglauber
terça-feira, 13 de outubro de 2009
Hospedagem grátis: Java + MySql
Olá povo,
Aqui vai uma boa dica para quem precisa hospedar, para testes, sites em Java . O site EATJ permite que você hospede sua aplicação de graça com as seguintes configurações:
A URL fica no seguinte formato: http://seuusuario.s156.eatj.com/
Um ponto negativo que eu verifiquei, é que as contas gratuitas tem seus servidores reiniciados a cada 6 horas. Mas como utilizei para testes, é uma boa opção.
4br4ç05,
nglauber
Aqui vai uma boa dica para quem precisa hospedar, para testes, sites em Java . O site EATJ permite que você hospede sua aplicação de graça com as seguintes configurações:
- Java 1.5 ou 1.6;
- Servidor Tomcat 5.5 ou 6.0 (permitindo o acesso ao Manager e o Administrator);
- Banco de dados MySql 4.1 ou 5.0 com acesso através do PHPMyAdmin.
A URL fica no seguinte formato: http://seuusuario.s156.eatj.com/
Um ponto negativo que eu verifiquei, é que as contas gratuitas tem seus servidores reiniciados a cada 6 horas. Mas como utilizei para testes, é uma boa opção.
4br4ç05,
nglauber
Assinar:
Postagens (Atom)