Google Custom Search Api desde Android

1
11576

Google Custom Search Api desde Android

0. Índice de contenidos.


1. Introducción

Debido a un correo que recibí hace poco, tuve que buscar información sobre como podía realizar búsquedas en internet desde un disposivo movil y poder tratar esos resultados sin tener que abrir un navegador.

Entonces pensé, que buscador importante puede haber que devuelva buenos resultados y además provea una api para poder utilizar sus servicios. El primer buscador que viene a la mente es como no Google, que además proporciona apis para la gran mayoría de sus servicios. Buscando información dí con esta página , que es justo lo que estaba buscando ;). El servicio nos permite realizar 100 consultas gratuitas al día, si tenemos previsto realizar más consultas tendremos que utilizar otro servicio o pasar por caja.


2. Requisitos previos

Como requisito indispensable es disponer de una cuenta de gmail.
Además necesitamos una clave que nos identificará a la hora de realizar las consultas. Para conseguir la clave nos dirigimos a https://code.google.com/apis/console/?api=customsearch&pli=1#welcome , y aceptamos la licencia. A continuación nos saldrá una ventana como la que aparece a continuación

Si en el botón aparece «Activate», lo pulsamos para activar, y si aparece «Deactivate» quiere decir que ya tenemos el servicio habilitado.

Para conocer nuestra clave, nos dirigimos a «API Access» en el menú de la derecha, y en el apartado «Access key» aparecerá nuestra clave.

Además vamos a crear un motor de búsqueda personalizado. Nos dirigimos a http://www.google.com/cse/ y pinchamos en «Crear motor de búsqueda».

Rellenamos la página como aparece a continuación. Lo único que tenéis que cambiar es las páginas en donde se van a realizar las búsquedas.

A continuación pulsamos en siguiente. Nos mostrará una pantalla en donde podemos utilizar un cuadro de texto para probar la configuración de nuestro buscador personalizado.
Pulsamos en siguiente y ya tendremos creado nuestro motor de búsqueda personalizado.

Ahora que tenemos el motor de búsqueda creado, necesitamos anotar un valor que más adelante vamos a necesitar. Entonces nos dirigimos a http://www.google.com/cse/manage/all?hl=es y clickeamos en el «Panel de control» del motor de búsqueda que acabamos de crear. Nos fijamos en el apartado que pone «ID único del motor de búsqueda» y anotamos el valor que aparece. En mi caso es 010306700704176754880:j_bbeym3x0g.



3. Uso de la API

Para utilizar esté servicio, tenemos que realizar una petición a una URL que deberemos componer nosotros. En el ejemplo que nos proporciona la documentación podemos ver

https://www.googleapis.com/customsearch/v1?key=INSERT-YOUR-KEY&cx=017576662512468239146:omuauf_lfve&q=lectures.

Si desglosamos la url tenemos:

  • https://www.googleapis.com/customsearch/v1
  • key=INSERT-YOUR-KEY
  • cx=017576662512468239146:omuauf_lfve
  • q=lectures

Como podemos ver, tenemos pasamos tres parámetros mediente la url. También es posible pasar un parámetro «callback» para especificarle una función de callback (http://code.google.com/intl/es-ES/apis/customsearch/v1/getting_started.html#JSONP).

El parámetro «key», hace referencia a la clave que hemos creado anteriormente.

El parámetro «cx», hace referencia al contexto con el que se realizarán las búsquedas. Es el identificador único que hemos obtenido al crear nuestro motor de búsqueda personalizado.

El parámetro «q», hace referencia a la búsqueda que vamos a realizar. Por ejemplo «hibernate», «spring», y en caso del ejemplo es «lectures».

Si abrimos un navegador e introducimos en la barra de direcciones la url formada con nuestros campos, obtendremos una cadena json con los resultados obtenidos.



4. Creando el cliente.

Ahora vamos a crear nuestro cliente para mostrar los resultados. Abrimos eclipse y creamos un nuevo proyecto de Android. Nuestra aplicación de Android va a constar de un activity que estará compuesto de un TextView en donde se pondrá lo que se quiere buscar, un botón para realizar la búsqueda y un ListView para mostrar los resultados que nos devuelva la búsqueda.

Las clases principales que vamos a necesitar para realizar nuestra aplicación son:

  • HttpRequest: Clase que va a realizar la conexión con el servicio de google.

  • package com.adictosaltrabajo.adictostutoriales.util;
    
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class HttpRequest {
    	
    	public static synchronized String doRequest(String urlRequest) throws Exception
        {
    		String jsonRespuesta = "";
    
    		HttpURLConnection urlConnection= null;
    		URL url = new URL(urlRequest);
    		urlConnection=(HttpURLConnection)url.openConnection();
    		urlConnection.setRequestMethod("GET");
    		jsonRespuesta = convertStreamToString(urlConnection.getInputStream());
    
        	return jsonRespuesta;
        }
    	
    	private static String convertStreamToString(InputStream is) throws Exception {
    	    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    	    StringBuilder sb = new StringBuilder();
    	    String line = null;
    	    while ((line = reader.readLine()) != null) {
    	      sb.append(line + "\n");
    	    }
    	    is.close();
    	    return sb.toString();
    	  }
    	
    }	
    
  • UrlFactory: Clase que nos va crear una url con nuestros parámetros para realizar la petición

  • package com.adictosaltrabajo.adictostutoriales.util;
    
    import java.net.URLEncoder;
    
    public class UrlFactory {
    
    	private static final String url = "https://www.googleapis.com/customsearch/v1";
    	private static final String cx = "010306700704176754880:j_bbeym3x0g";
    	private static final String key = "INSERT YOUR KEY HERE";
    	
    	public static String buildUrl(String keywords) throws Exception{		
    		return url + "?key=" + key + "&cx=" + cx + "&q=" + URLEncoder.encode(keywords);
    	}
    	
    }
    
  • ResultDeserializer: Clase que nos va a transformar el objeto jSon devuelto por el servicio en una lista de items con los resultados de la búsqueda
  • package com.adictosaltrabajo.adictostutoriales.util;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import com.adictosaltrabajo.adictostutoriales.bean.Item;
    import com.adictosaltrabajo.adictostutoriales.bean.Result;
    
    
    public class ResultDeserializer{
    
    	public static Result deserialize(String object) throws JSONException 
    	{
    		Result result = new Result();
    		
    		final List items = new ArrayList();
    		
    		JSONObject jSonObject = new JSONObject(object);
    		JSONArray jSonObjectArray = jSonObject.getJSONArray("items");
    		for(int count = 0; count < jSonObjectArray.length();count++){
    			JSONObject jsonItem = (JSONObject) jSonObjectArray.get(count);
    
    			Item item = new Item();
    			item.setTitle(jsonItem.getString("title"));
    			item.setHtmlTitle(jsonItem.getString("htmlTitle"));
    			item.setLink(jsonItem.getString("link"));
    			item.setDisplayLink(jsonItem.getString("displayLink"));
    			item.setSnippet(jsonItem.getString("snippet"));
    			item.setHtmlSnippet(jsonItem.getString("htmlSnippet"));
    			
    			items.add(item);
    		}
    
    		result.setItems(items);
    		
    		return result;
    	}
    }
    
  • Item: Clase que contendrá la información de cada resultado devuelto por el servicio

Modificamos la vista que nos crea Eclipse y añadimos un TextView, un ImageButton y un Listview para poder mostrar los resultados de la búsqueda.



    
        ?/EditText>
        
    
    

y por último creamos nuestra clase principal.

package com.adictosaltrabajo.adictostutoriales;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

import com.adictosaltrabajo.adictostutoriales.bean.Result;

public class Main extends Activity implements OnClickListener, OnItemClickListener{
	
	private final Search search = new Search();
	private ImageButton ibDoSearch;
	private TextView tvSearch;
	private ListView lvResults;
	private Result result = new Result();
	
	final Handler handler = new Handler();
	final Runnable updateItems = new Runnable(){
		public void run(){
			updateItemsInUI();
		}
	};
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        init();
    }
    
    protected Result updateResult(String keywords){
    	Result newResult = new Result();
		try {
			newResult = search.doSearch(keywords);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return newResult;
    }
    
    protected void updateItemsInUI() {
    	if(0 == result.getItems().size()){
    		Toast.makeText(this, "No se ha encontrado ningún resultado", Toast.LENGTH_SHORT).show();
    	}
    	TutorialsInfoAdapter tutorialsInfoAdapter = new TutorialsInfoAdapter(this, result.getItems());
        lvResults.setAdapter(tutorialsInfoAdapter);
	}

	public void init(){
    	lvResults = (ListView) findViewById(R.id.lvResults);
    	lvResults.setOnItemClickListener(this);
    	tvSearch = (TextView) findViewById(R.id.tvSeach);
        ibDoSearch = (ImageButton) findViewById(R.id.ibSearch);
        ibDoSearch.setOnClickListener((android.view.View.OnClickListener) this);
    }

	@Override
	public void onClick(View arg0) {
		switch(arg0.getId())
		{
			case R.id.ibSearch :
				final String textToSearch = tvSearch.getText().toString().trim();
				Thread t = new Thread(){
					public void run(){
						result = updateResult(textToSearch);
						handler.post(updateItems);
					}
				};
				Toast.makeText(this,"Realizando búsqueda",Toast.LENGTH_SHORT).show();
				t.start();
				hideInputMethod();
				break;
		}
	}
	
	private void hideInputMethod(){
		InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
		imm.hideSoftInputFromWindow(tvSearch.getWindowToken(), 0);
	}

	@Override
	public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) {
		
		Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(result.getItems().get(arg2).getLink()));
		startActivity(intent); 
	}

}

Aquí tenéis unas capturas para ver como funciona el invento 🙂




Aquí tenéis el código fuente del proyecto y el programa por si alguien quiere probarlo 😉

Proyecto para Eclipse

Apk con el programa.

1 COMENTARIO

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad