Criando sua aplicação Rails + Android

Olá a todos. Que android é o que há no momento todo mundo já sabe. Mas para alguns desenvolvedores que vem de outra linguagem como Ruby pode parecer uma coisa de outro mundo desenvolver em Java. Na verdade isto pra mim ainda é um terreno desconhecido mas vamos lidando.
Meu intuito com este post é mostrar uma aplicação simples, bem simples mesmo, onde um formulário de uma aplicação em android envia informações via Post para uma aplicação rails. Vou tentar ser direto ao ponto e me desculpem pelas asneiras em java, como já escrito acima, não sou o melhor exemplo nesta área. Prontos ou não… da hadouken Ryu…
Vamos fazer a parte simples: a aplicação em Rails 3 que cadastrará as fofocas que pessoas contaram uma das outras

rails new fofoca
cd fofoca
bundle install
rails g scaffold Segredo de:string para:string ex_segredo:text
rake db:migrate
rails s

Acessando localhost:3000/segredos é possível verificar o que as maracutais que serão enviadas como segredos =)
Agora vem a parte do android que por sinal é simples. Estou partindo do princípio que quem está lendo possui Eclipse com Android instalado e configurado. Caso não tenha veja esses links, é rápido e simples.

how to http://developer.android.com/sdk/installing.html

downloads necessários http://developer.android.com/sdk/index.html

Ok então… lá vão os códigos:
Arquivo de layout main.xml (tela inicial da aplicação)








E o arquivo Main.java

package com.toledo;

import java.util.ArrayList;

import java.util.List;

import org.apache.http.HttpResponse;

import org.apache.http.NameValuePair;

import org.apache.http.client.HttpClient;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

public class Main extends Activity {
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Button btnEnviar = (Button) findViewById(R.id.btnEnviar);
    btnEnviar.setOnClickListener(new View.OnClickListener() {
      public void onClick(View view) {
        enviarParaCadastro();
        Intent myIntent = new Intent(view.getContext(), TrackMeet.class);
        startActivityForResult(myIntent, 0);
      }
    });
  }
  public void enviarParaCadastro() {
    final EditText editDe = (EditText) findViewById(R.id.editDe);
    String de = editDe.getText().toString();
    final EditText editPara = (EditText) findViewById(R.id.editPara);
    String para = editPara.getText().toString();
    final EditText editExSegredo = (EditText) findViewById(R.id.editExSegredo);
    String ex_segredo = editExSegredo.getText().toString();
    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost("http://10.0.2.2:3000/segredos");
    List pairs = new ArrayList();
    pairs.add(new BasicNameValuePair("segredo[de]",         de));
    pairs.add(new BasicNameValuePair("segredo[para]",       para));
    pairs.add(new BasicNameValuePair("segredo[ex_segredo]",     ex_segredo));
    try {
      post.setEntity(new UrlEncodedFormEntity(pairs));
      HttpResponse response = client.execute(post);
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}

Bate-bola sobre os arquivos:
main.xml contém é a tela inicial do projeto com o formulário
Main.java Classe que faz todo o trabalho de criar o evento de clicar no botão Enviar e os dados serem enviados ao servidor. Uma dica importante é que o servidor no caso responde por 10.0.2.2 mas quando for publicar online troquem o endereço certo?!

Pronto… é só fazer o build da aplicação no emulador do android e testar.

  • RonaldRails

    Sua aplicação rails irá barrar este post vindo de uma aplicação externa. Pois não terá o toke de segurança sendo passado.

    • foolkgs

      Fala Ronald.
      É verdade Ronald, para permitir seria necessário editar o arquivo application_controller.rb e comentar a linha de proteção.
      Mas também não é uma boa decisão, como se trata apenas de um how to servirá apenas para os primeiros passos.

      class ApplicationController < ActionController::Base
      # protect_from_forgery

    • Paulo de Tarso

      Como permitir que uma aplicação externa interaja com sua aplicação em Rails? Se puder indicar material eu ficaria muito grato.

  • Luiz Gustavo

    Olá Foolkgs!

    Eu sou iniciante no android e fiquei sem saber como implementar a classe TrackMeet utilizada no Intent que eu acho que acabou gerando um erro e eu não consegui utilizar a aplicação.

    Teria como você me ajudar nisso??

    • Anderson

      Também deu erro no meu, não sei o que devo fazer… :S

  • fabiano

    Poxa qdo eu vejo um código java sempre me pergunto porque as pessoas gostam de se submeter a escrever tanto..mas tanto mesmo…olha a qtd de import neste código…sem falar na memória que o java consome….desculpem me os adeptos…