Mostrando postagens com marcador SDcard. Mostrar todas as postagens
Mostrando postagens com marcador SDcard. Mostrar todas as postagens

segunda-feira, 13 de fevereiro de 2012

Android: Dicas 6

Olá povo,

Mais um post da série "Dicas de Android". Deixem suas sugestões para os próximos posts.

1 Instalar APK a partir da sua aplicação.
File apk = new File(
  Environment.getExternalStorageDirectory() + 
  "/Copas.apk");
Intent it = new Intent(Intent.ACTION_VIEW);
it.setDataAndType(Uri.fromFile(apk),
  "application/vnd.android.package-archive");
startActivity(it);

O código acima, carrega um arquivo (Copas.apk) que está na raiz do cartão de memória e dispara uma Intent que perguntará se o usuário deseja instalar a aplicação. Ao confirmar, a aplicação será instalada.

2. Criando arquivos no cartão de memória.
O código abaixo mostra como criar um diretório no cartão de memória do aparelho e depois cria um arquivo nesse diretório.
File meuDir = new File(
  context.getExternalFilesDir(null), "meuDir");
if (!meuDir.exists()) {
  meuDir.mkdir();
}

try {
 File arquivoTxt = new File(meuDir, "arquivo.txt");
 if (!arquivoTxt.exists()) {
   arquivoTxt.createNewFile();
 }
 FileOutputStream fos =
   new FileOutputStream(arquivoTxt);

 fos.write("Exemplo".getBytes());
 fos.close();
   
} catch (IOException e) {
 e.printStackTrace();
}


Adicione a permissão no AndroidManifest.xml
<uses-permission
 android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Vale salientar que o código acima criará um diretório com o nome do pacote da aplicação na pasta Android que está na raiz do cartão de memória. Outro detalhe importante é que o arquivo será excluído caso a aplicação seja desinstalada.

3. Texto sublinhado ou strike no TextView
No editor visual do Android podemos alterar a propriedade android:textStyle para bold ou italic. Mas para o strike (como isso) ou sublinhado (como isso). Precisamos utilizar o código abaixo.
textView.setPaintFlags(
  textView.getPaintFlags() | 
  Paint.STRIKE_THRU_TEXT_FLAG);

O código acima, coloca o textView como strike. Para usar sublinhado, use a constante UNDERLINE_TEXT_FLAG da classe Paint.
Crédito dessa dica para Alvaro Cavalcanti.

4. Voltando para tela inicial da Activity
Digamos que você tem as Activities A, B, C e D. E da tela D você quer voltar pra A, faça o seguinte:
Intent it = new Intent(this, A.class);
it.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(it);

Essa chamada fará com que a Activity "A" seja re-criada, ou seja, o onCreate da mesma será chamado novamente. Para evitar isso, coloque no manifest, na declaração abaixo:
<activity
  android:name=".A"
  android:label="Primeira Activity"
  android:launchMode="singleTop"/>

Com isso, o método onNewIntent será chamado (ao invés do onCreate) e você poderá fazer algum tratamento lá baseado na nova Intent que está chegando.

5. Aumentando a memória disponível para aplicação
Estava trabalhando em uma aplicação Android para tablets que estava dando OutOfMemoryError. Após algumas investigações checamos que estávamos alocando muitas imagens, mas estávamos desalocando todas, ou seja, aparentemente tudo certo. Então nos deparamos com a propriedade abaixo:
<application
  android:largeHeap="true"
  ...>

Sem muita documentação, a propriedade acima, aumenta a memória da Dalvik (máquina virtual do Android) reservada para a aplicação, e para nós, funcionou.
Créditos para Andréa Santos (apesar dela não querer compartilhar informações) :D

6. Evitando cast no findViewById
Todo mundo que fez mais que um HelloWorld com Android, sabe que para obter a referência de um componente declarado em um arquivo de layout utiliza-se o método findViewById. Mas como esse método retorna um objeto da classe View (que é a superclasse de todos os componente visuais do Android) temos que fazer o cast para o componente desejado como abaixo:
Button b = (Button)findViewById(R.id.meuBotao);

Mas existe uma maneira de evitar esse cast utilizando o recurso de Generics do Java. Basta declarar o método abaixo na sua Activity.
@SuppressWarnings("unchecked")
private <T>T getViewById(int id){
  return (T)findViewById(id);
}

E para utilizar:
Button b = getViewById(R.id.meuBotao);

Economizamos aí alguns caracteres :) Créditos para Gustavo Pinto e José André Henrique.

Dúvidas ou sugestões? Deixem seus comentários.

4br4ç05,
nglauber

sexta-feira, 2 de setembro de 2011

Android: Dicas 4

Olá povo,

Segue mais um POST da série "dicas de Android".

Dica 1 - Obter o espaço disponível no aparelho

File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
long ocupedBlocks =
stat.getBlockCount() - availableBlocks;

String s1 = Formatter.formatFileSize(
this, availableBlocks * blockSize);
String s2 = Formatter.formatFileSize(
this, ocupedBlocks * blockSize);
System.out.println("---------------");
System.out.println("s = "+ s1);
System.out.println("s = "+ s2);

Dica 2 - Teclado Virtual Sobre o Layout
Ao exibir o teclado virtual, o Android automaticamente redimensiona a tela do aparelho para exibir todos os elementos. Então se você tiver, por exemplo uma barra com botões na parte inferior, eles irão aparecer imediatamente em cima do teclado virtual. Para evitar isso, basta colocar a seguinte configuração na declaração da sua Activity no AndroidManifest.xml.

<activity
android:name=".ui.MainActivity"
android:windowSoftInputMode="adjustPan"
/>

Dica 3 - Evitando abrir a mesma atividade 2 vezes
Os engenheiros de teste com frequência tentam "destruir" a aplicação de algum jeito :) E um bem comum é clicar rapidamente em um botão. Se esse botão chamar uma Activity serão abertas duas em sequência. Para evitar isso, basta colocar a seguinte configuração na declaração da sua Activity no AndroidManifest.xml.


<activity
android:name=".ui.MainActivity"
android:launchMode="singleTop"
/>

Isso faz com que só seja possível apenas uma instância no topo da pilha de atividades.

Dica 4 - Alterando a linha abaixo da TabWidget
Essa dica é um complemento da dica sobre como mudar a imagem das abas da TabWidget. O código abaixo mostra como mudar a linha que fica na parte inferior da TabWidget. Ela tem um aspecto interessante, pois a API só disponibilizou um método "digno" pra isso a partir do Android 2.2, para as versões anteriores, essa operação tem que ser feita via Reflection.


// Esse código deve ser chamado dentro de
// uma TabActivity
TabWidget tabWidget = getTabWidget();

if (android.os.Build.VERSION.SDK_INT >=
android.os.Build.VERSION_CODES.FROYO){
// For Android 2.2
tabWidget.setLeftStripDrawable(
R.drawable.barra_menu);
tabWidget.setRightStripDrawable(
R.drawable.barra_menu);
} else {
// For Android 2.1 or before
try {
Field stripLeft = tabWidget.getClass().
getDeclaredField("mBottomLeftStrip");
Field stripRight = tabWidget.getClass().
getDeclaredField("mBottomRightStrip");

if (!stripLeft.isAccessible())
stripLeft.setAccessible(true);
if (!stripRight.isAccessible())
stripRight.setAccessible(true);

stripLeft.set(tabWidget,
getResources().getDrawable(
R.drawable.barra_menu));

stripRight.set(tabWidget,
getResources().getDrawable(
R.drawable.barra_menu));

} catch (Exception e) {
e.printStackTrace();
}
}

Nesse exemplo, estou usando a API level 8 (Android 2.2) no Eclipse para poder ter acesso aos métodos setLeftStripDrawable e setRightStripDrawable. Porém ele pode ser executado em aparelhos 2.1, que neste caso executará o código via Reflection. Para dar suporte a API 2.1, mesmo desenvolvendo com a 2.2 basta colocar a tag abaixo no AndroidManifest.xml.

<uses-sdk android:minSdkVersion="7" />

Dica 5 - Salvar estado do scroll da ListView
Na aplicação que estou desenvolvendo, sempre estava reatribuindo o Adapter à ListView no onResume da Activity. O problema era que eu clicava em um item da lista lá do final pra edita-lo era aberta a tela pra edição. Quando fechava essa tela, aí abria a tela de detalhes, mas quando voltava pra tela de listagem queria manter a posição do scroll.


// savedIndex e savedY é um atributo int

// Salvar estado
// Esse código coloquei no onPause
savedIndex = getListView().getFirstVisiblePosition();
View v1 = getListView().getChildAt(0);
savedY = (v1 == null) ? 0 : v1.getTop();

// Restaurando estado
// Esse código eu coloquei no onResume
setListAdapter(novoAdapter);
getListView().setSelectionFromTop(savedIndex, savedY);

Dica 6 - Checar se o GPS está habilitado
Existe basicamente duas formas de obter a posição geográfica no Android: por GPS e pela Rede de Dados. Essa configuração fica no menu Configurações > Local > Meu Local. Se sua aplicação usa geolocalização, você deve checar se uma dessas opções está habilitada.

public boolean isEnabled() {
LocationManager lm = (LocationManager)
context.getSystemService(
Context.LOCATION_SERVICE);

return
locationManager.isProviderEnabled(
LocationManager.GPS_PROVIDER) ||
locationManager.isProviderEnabled(
LocationManager.NETWORK_PROVIDER);
}
Dica 7 - Problema no GoogleMaps
Essa dica foi mandada pelo meu aluno da LinuxFI, Sávio (Sávio saviojp@gmail.com).
Durante a aula de Mapas eu passei pelo seguinte problema: Mesmo com todas as configurações da API Key e permissões definidas de modo correto, o meu emulador não carregava o mapa. Para solucionar esse problema fiz o seguinte:

Customizei a execução da aplicação no eclipse por meio do Run Configurations/Android Application /na aba Target no campo Additional Emulator Command Line Options, setei o comando: -dns-server 8.8.8.8.

4br4ç05,
nglauber