Saturday, September 1, 2012

Implement Google Search (JSON) for Android

In this exercise, we search using Google Search API of JSON format. The item to be searched is fixed "android", and the query is http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=android

Implement Google Search (JSON) for Android


The method sendQuery(String) send the query to Google Search API, the returned result is a string in JSON format.

The method ParseResult(String) parse the JSON result to string.

We have to implement a AsyncTask, JsonSearchTask, to do the jobs in background. Otherwise, android.os.NetworkOnMainThreadException will be thrown. Refer to the post android.os.NetworkOnMainThreadException.

Finally, we have to modify AndroidManifest.xml to add permission of "android.permission.INTERNET".

package com.example.androidajaxsearch;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.widget.TextView;

public class MainActivity extends Activity {
 
 String search_url = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=";
 String search_item = "android";
 String search_query = search_url + search_item;

 TextView textResult;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        textResult = (TextView)findViewById(R.id.result);
        
        new JsonSearchTask().execute();
    }
    
    private class JsonSearchTask extends AsyncTask<Void, Void, Void>{

     String searchResult = "";
     
  @Override
  protected Void doInBackground(Void... arg0) {
   
   try {
    searchResult = ParseResult(sendQuery(search_query));
   } catch (JSONException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   
   return null;
  }

  @Override
  protected void onPostExecute(Void result) {
   
   textResult.setText(searchResult);
   
   super.onPostExecute(result);
  }
     
    }

    private String sendQuery(String query) throws IOException{
     String result = "";
     
     URL searchURL = new URL(query);
     
     HttpURLConnection httpURLConnection = (HttpURLConnection) searchURL.openConnection();
     
     if(httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK){
      InputStreamReader inputStreamReader = new InputStreamReader(httpURLConnection.getInputStream());
      BufferedReader bufferedReader = new BufferedReader(
        inputStreamReader,
        8192);
      
      String line = null;
      while((line = bufferedReader.readLine()) != null){
       result += line;
      }
      
      bufferedReader.close();
     }
     
     return result;
    }
    
    private String ParseResult(String json) throws JSONException{
     String parsedResult = "";
     
     JSONObject jsonObject = new JSONObject(json);
     JSONObject jsonObject_responseData = jsonObject.getJSONObject("responseData");
     JSONArray jsonArray_results = jsonObject_responseData.getJSONArray("results");
     
     parsedResult += "Google Search APIs (JSON) for : " + search_item + "\n";
     parsedResult += "Number of results returned = " + jsonArray_results.length() + "\n\n";
     
     for(int i = 0; i < jsonArray_results.length(); i++){
      JSONObject jsonObject_i = jsonArray_results.getJSONObject(i);
      parsedResult += "title: " + jsonObject_i.getString("title") + "\n";
      parsedResult += "content: " + jsonObject_i.getString("content") + "\n";
      parsedResult += "url: " + jsonObject_i.getString("url") + "\n";
      parsedResult += "\n";
     }
     
     return parsedResult;
    }
}


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        tools:context=".MainActivity" />
    <ScrollView 
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#A0A0A0">
            <TextView
                android:id="@+id/result"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
        
    </ScrollView>
    

</LinearLayout>


Download the files.

Next:
- Implement Google Search (JSON) for Android, display in WebView.
- Google Search with custom search phase


1 comment:

Anonymous said...

Where is the result??