Post on 31-May-2015
Android: Exemplos de código Sistemas Distribuídos
Dupla: Camila Pereira dos Santos
Calvin Rodrigues da Costa
Introdução
• Toda classe voltada a aplicações Android precisa ser derivada da classe Activity e possuir o método onCreate como método principal.
Activity
• Uma Activity é um componente que fornece uma tela com a qual os usuários podem interagir durante a execução do aplicativo.
Método onCreate
• O método onCreate invoca o método onCreate da super classe passando o parâmetro savedInstanceState;
• Após invocar o método onCreate da super classe, é invocado o método setContentView.
O método setContentView
• O setContentView é responsável por exibir a tela da aplicação com base nos layouts xml.
O método setContentView II
O método setContentView III
Diretório res
• No diretório res ficam armazenados todos os recursos utilizados pela aplicação;
• Nele, há os subdiretórios drawables, layout e values.
Subdiretórios drawables
• Os subdiretórios drawables guardam imagens;
• A diferença de uso entre um e outro se encontra no quesito resolução.
Subdiretório layout
• O subdiretório layout guarda todas as layouts referentes à aplicação;
• As layouts normalmente são arquivos “.xml”.
Subdiretório layout II
• As Layouts
▫ Nelas encontram-se as informações referentes às telas.
Subdiretório layout III
• O subdiretório layout pode possuir uma variação layout-land de maneira a permitir que sejam apresentadas as telas no formato portrait ou landscape de acordo com a posição do dispositivo.
Subdiretório layout IV
Subdiretório layout V
Subdiretório values
• Nele são armazenados valores estáticos que sirvam de uso para algum arquivo “.xml”;
• Normalmente esses valores estáticos são armazenados no arquivo “strings.xml”.
Subdiretório values II
• Strings
▫ Textos devem ser preferencialmente definidos no arquivo string.xml de forma a facilitar:
o reuso de valores;
a tradução do app para outra linguagem.
Arquivo Manifest
• É no arquivo Manifest em que se encontram as definições referentes ao aplicativo;
• Também define as permissões do aplicativo.
Arquivo Manifest II
Exemplo 2: Uso da câmera [2]
A câmera do Android pode ser utilizada de duas formas diferentes:
• API da câmera no Android
▫ Codificar manualmente
• Uso do aplicativo da câmera
▫ Intent
Importações
import java.io.File; //arquivos
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap; //imagem
import android.graphics.BitmapFactory;
import android.net.Uri; //caminho import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import android.widget.VideoView;
Arquivo MainActivity.java
Manifest
• Requisito de que o aparelho tenha câmera:
▫ android.hardware.camera <uses-feature android:name="android.hardware.camera" />
• Permissão para escrever no cartão SD:
▫ WRITE_EXTERNAL_STORAGE <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Activity
• Todas as classes de telas herdam Activity e possuem um método onCreate.
public class MainActivity extends Activity {
[...]
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
[...]
Exibe a tela definida no arquivo activity_main.xml
Arquivo Strings
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">SDCamera</string>
<string name="hello_world">Hello - Camera!</string>
<string name="action_settings">Settings</string>
<string name="capturarFoto">Nova foto</string>
<string name="gravarVideo">Gravar vídeo</string>
</resources>
Layout • Activity_main.xml
<LinearLayout
android:layout_width="0dp“
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center“
android:orientation="vertical" >
<!-- Botão de captura-->
<Button
android:id="@+id/btnCapturePicture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=“@string/capturarFoto"
android:layout_marginBottom="10dp"/>
Define um id para o botão, que pode ser referenciado na Activity
Layout
<!-- Visualizar imagem -->
<ImageView
android:id="@+id/imgPreview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />
Activity e Layout
• Arquivo R.java, gerado automaticamente, funciona como uma “interface” entre o código Java e o código XML.
• É possível obter um componente definido em um layout:
imgPreview = (ImageView) findViewById(R.id.imgPreview);
videoPreview = (VideoView) findViewById(R.id.videoPreview);
btnCapturePicture =(Button)findViewById(R.id.btnCapturePicture);
Suporte a câmera
Verifica se a câmera está disponível e fecha a aplicação, caso contrário. [...] if (!isDeviceSupportCamera()) { Toast.makeText(getApplicationContext(),“Não há suporte à câmera”, Toast.LENGTH_LONG).show(); finish(); } private boolean isDeviceSupportCamera() { if(getApplicationContext().getPackageManager().hasSystemFeature( PackageManager.FEATURE_CAMERA)) { return true; } else { return false; } }
Captura da imagem
Obtém o botão da tela, definido no arquivo xml da tela. Em seguida, define que o evento de clique deve chamar a função de captura de imagem.
[...]
btnCapturePicture= (Button)= findViewById(R.id.btnCapturePicture);
// Evento de captura de imagem quando clica no botão
btnCapturePicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
captureImage();
}
});
Captura da imagem
Cria-se um objeto Intent, que inicia o aplicativo de câmera do Android.
private void captureImage() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
// Inicia o Intent da captura de imagem da câmera
startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
}
Exibição da imagem
Esse método é chamado após fechar a câmera.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Se for uma captura de imagem
if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// A captura funcionou, então exibe e imagem
previewCapturedImage();
}
[...]
}
Exibição da imagem
Exibe a imagem capturada na tela.
Private void previewCapturedImage() {
try {
videoPreview.setVisibility(View.GONE);
imgPreview.setVisibility(View.VISIBLE);
BitmapFactory.Options options = new BitmapFactory.Options();
// diminui o tamanho da imagem, para evitar OutOfMemory Exception
options.inSampleSize = 8;
final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(),
options);
imgPreview.setImageBitmap(bitmap);
} catch (NullPointerException e) { e.printStackTrace(); }
}
Exemplo 3: Web Services REST [5]
• Web Service que retorna os melhores jogadores de um jogo:
http://www.cheesejedi.com/rest_services/get_big_cheese?level=1.
É feita uma requisição http para o REST em uma thread background. O resultado, é retornado para a thread principal.
Manifest
• Permissão para acessar a internet, para permitir a requisição http para o Web Service.
<uses-permission android:name= “android.permission.INTERNET” />
Importações
• import java.io.IOException;
• import java.io.InputStream;
• import org.apache.http.HttpEntity;
• import org.apache.http.HttpResponse;
• import org.apache.http.client.HttpClient;
• import org.apache.http.client.methods.HttpGet;
• import org.apache.http.impl.client.DefaultHttpClient;
• import org.apache.http.protocol.BasicHttpContext;
• import org.apache.http.protocol.HttpContext;
• import android.app.Activity;
• import android.os.AsyncTask;
• import android.os.Bundle;
• import android.view.View;
• import android.view.View.OnClickListener;
• import android.widget.Button;
• import android.widget.EditText;
Activity
public class MainActivity extends Activity implements OnClickListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.my_button).setOnClickListener(this);
}
@Override
public void onClick(View arg0) {
Button b = (Button)findViewById(R.id.my_button);
b.setClickable(false);
new RequisicaoWSRest().execute();
}
RequisicaoWSRest
• RequisicaoWSRest herda AsyncTask. Essa classe possibilita operações em segundo plano e retornar os resultados para a thread principal.
private class RequisicaoWSRest extends AsyncTask <Void, Void, String>
Mensagens de Log
Métodos para salvar mensagens de log:
Método Descrição
Log.v() verbose
Log.d() debug
Log.i() info
Log.w() warn
Log.e() error
RequisicaoWSRest • Cria um HttpClient que faz a requisição para o endereço do Web
Service. Obtém a resposta e a converte para texto, pelo método getASCIIContentFromEntity.
@Override protected String doInBackground(Void... params) { HttpClient httpClient = new DefaultHttpClient(); HttpContext localContext = new BasicHttpContext(); HttpGet httpGet = new HttpGet( "http://www.cheesejedi.com/rest_services/get_big_cheese.php?puzzle=1"); String text = null; try { HttpResponse response = httpClient.execute(httpGet, localContext); HttpEntity entity = response.getEntity(); text = getASCIIContentFromEntity(entity); } catch (Exception e) { Log.w("RequisicaoREST","Resposta não recebida"); return e.getLocalizedMessage(); } return text; }
RequisicaoWSRest
• O texto retornado pelo Web Service
é definido no campo de texto da tela
protected void onPostExecute(String results) {
if (results!=null) {
EditText et = (EditText)findViewById(R.id.my_edit);
et.setText(results);
}
Button b = (Button)findViewById(R.id.my_button);
b.setClickable(true);
}
Referências Bibliográficas
• [1] Apostila de Android – Programando Passo a Passo. 4ª edição. 2010. Luciano Alves da Silva. Disponível em http://www.apostilaandroid.net/
• [2] http://developer.android.com/guide/topics/media/camera.html
• [3] http://www.androidhive.info/2013/09/android-working-with-camera-api/
• [4] http://www.streamhead.com/android-tutorial-sd-card/
• [5] http://www.techrepublic.com/blog/software-engineer/calling-restful-services-from-your-android-app/1076/
• [6] http://developer.android.com/guide/components/activities.html