Verão passado eu estava em um curso de desenvolvimento para dispositivos móveis e tive a oportunidade de aprender um pouquinho sobre desenvolvimento para Android. Já se passaram alguns meses desde que terminei a classe, mas vou tentar estimular minha memória e comentar um pouco sobre o código que escrevi antes que eu esqueça tudo.
Para meu último projeto, eu tentei criar um pequeno aplicativo para minha Igreja e em uma das “Atividades”, eu mostrava uma lista com nossos videos que estão postados na nossa conta do Vimeo. É uma “atividade” com uma simples lista, o que me permitiu focar no trabalho mais interessante de fazer o download dos dados e fazer uma análise sintática da lista do Vimeo.
O Vimeo disponibilizou uma API simples para desenvolvedores obterem informações sobre videos, usuários, grupos, etc… A API suporta multiplos formatos de resposta. Eu usei o formato JSON e na minha Activity
eu usei as classes JSONArray
e JSONObject
para analisar a resposta. A API está bem documentada no site do Vimeo, mas basicamente é assim:
http://vimeo.com/api/v2/username/request.output
username
– id do usuário
request
– Os dados que você quer.
output
– Tipo de formato (JSON, PHP, XML)
A classe Activity
continha uma classe privada que extendia AsyncTask
.
private class LongRunningGetIO extends AsyncTask <Void, Void, String> {
Depois, dois metodos foram sobreescritos: doInBackground
e onPostExecute
. No doInBackground
, a requisição é enviada para obter os dados.
@Override
protected String doInBackground(Void... params) {
HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet =
new HttpGet("http://vimeo.com/api/v2/<your_username>/videos.json");
String text = null;
try {
HttpResponse response = httpClient.execute(httpGet, localContext);
HttpEntity entity = response.getEntity();
// TODO: change and test to use: EntityUtils.toString(httpEntity);
text = getASCIIContentFromEntity(entity);
} catch (Exception e) {
return e.getLocalizedMessage();
}
return text;
}
onPostExecute
analisa a resposta e adiciona o resultado num ArrayList
. Usando um SimpleAdapter
, o título e as datas dos vídeos são exibidos num widget ListView
. Veja o código abaixo:
protected void onPostExecute(String results) {
if (results!=null) {
ArrayList<HashMap<String, String>> videoList =
new ArrayList<HashMap<String, String>>();
// parse json response and add to a list
try {
JSONArray jsonVideoList = new JSONArray(results);
for(int i = 0; i < jsonVideoList.length(); i++) {
JSONObject video = jsonVideoList.getJSONObject(i);
HashMap<String, String> map = new HashMap<String, String>();
// Storing each json item
map.put("title", video.getString("title"));
map.put("mobile_url", video.getString("mobile_url"));
// format the date, but adding both date formats,
// just in case it is needed in the future
video.getString("upload_date");
String json_upload_date = video.getString("upload_date");
Date date =
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US).
parse(json_upload_date);
String fDate = new SimpleDateFormat("MMM d, yyyy", Locale.US).
format(date);
map.put("upload_date", json_upload_date);
map.put("upload_date_formatted", fDate);
videoList.add(map);
}
} catch (Exception e) {
}
// add video list to ListView widget
String from[] = {"title", "upload_date_formatted"};
int to[] = { android.R.id.text1, android.R.id.text2 };
ListAdapter adapter = new SimpleAdapter(SermonActivity.this,
videoList, android.R.layout.simple_list_item_2,
from, to);
ListView lv= (ListView)findViewById(R.id.sermonListView);
lv.setAdapter(adapter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, final View view,
int position, long id) {
@SuppressWarnings("unchecked")
HashMap<String, String> map = (HashMap<String, String>)
parent.getItemAtPosition(position);
// launch video
startActivity(new Intent(Intent.ACTION_VIEW,
Uri.parse(map.get("mobile_url"))));
}
});
}
}