In the previous chapter we have created the Java WEB Service that will talk to our Android application and respond back with JSON. Here we are going to develop our Android application that send HTTP request to the WEB Service, parse and display the JSON response on the screen.
Source for manifest file AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.as400samplecode" android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="13" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application android:icon="@drawable/icon" android:label="@string/app_name"
android:theme="@android:style/Theme.Holo.Light"
android:screenOrientation="sensorLandscape">
<service android:name=".JSONRequest" />
<activity android:name=".AndroidJSONTutorialActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Source for IntentService to process any Web Request JSONRequest.java
package com.as400samplecode;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import com.as400samplecode.AndroidJSONTutorialActivity.MyRequestReceiver;
import android.app.IntentService;
import android.content.Intent;
import android.util.Log;
public class JSONRequest extends IntentService{
private String inMessage;
public static final String IN_MSG = "requestType";
public static final String OUT_MSG = "outputMessage";
public JSONRequest() {
super("JSONRequest");
}
@Override
protected void onHandleIntent(Intent intent) {
//Get Intent extras that were passed
inMessage = intent.getStringExtra(IN_MSG);
if(inMessage.trim().equalsIgnoreCase("getCountryInfo")){
String countryCode = intent.getStringExtra("countryCode");
getCountryInfo(countryCode);
}
else if(inMessage.trim().equalsIgnoreCase("getSomethingElse")){
//you can choose to implement another transaction here
}
}
private void getCountryInfo(String countryCode) {
//prepare to make Http request
String url = "http://10.0.2.2:8080/AndroidJSONWebService" + "/CountryServlet";
//add name value pair for the country code
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("countryCode",countryCode));
String response = sendHttpRequest(url,nameValuePairs);
//broadcast message that we have received the reponse
//from the WEB Service
Intent broadcastIntent = new Intent();
broadcastIntent.setAction(MyRequestReceiver.PROCESS_RESPONSE);
broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
broadcastIntent.putExtra(IN_MSG, inMessage);
broadcastIntent.putExtra(OUT_MSG, response);
sendBroadcast(broadcastIntent);
}
private String sendHttpRequest(String url, List<NameValuePair> nameValuePairs) {
int REGISTRATION_TIMEOUT = 15 * 1000;
int WAIT_TIMEOUT = 60 * 1000;
HttpClient httpclient = new DefaultHttpClient();
HttpParams params = httpclient.getParams();
HttpResponse response;
String content = "";
try {
//http request parameters
HttpConnectionParams.setConnectionTimeout(params, REGISTRATION_TIMEOUT);
HttpConnectionParams.setSoTimeout(params, WAIT_TIMEOUT);
ConnManagerParams.setTimeout(params, WAIT_TIMEOUT);
//http POST
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
//send the request and receive the repponse
response = httpclient.execute(httpPost);
StatusLine statusLine = response.getStatusLine();
if(statusLine.getStatusCode() == HttpStatus.SC_OK){
ByteArrayOutputStream out = new ByteArrayOutputStream();
response.getEntity().writeTo(out);
out.close();
content = out.toString();
}
else{
//Closes the connection.
Log.w("HTTP1:",statusLine.getReasonPhrase());
response.getEntity().getContent().close();
throw new IOException(statusLine.getReasonPhrase());
}
} catch (ClientProtocolException e) {
Log.w("HTTP2:",e );
} catch (IOException e) {
Log.w("HTTP3:",e );
}catch (Exception e) {
Log.w("HTTP4:",e );
}
//send back the JSON response String
return content;
}
}
Source for Android Activity file AndroidJSONTutorialActivity.java
package com.as400samplecode;
import java.text.DecimalFormat;
import org.json.JSONException;
import org.json.JSONObject;
import com.as400samplecode.util.Country;
import com.google.gson.Gson;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class AndroidJSONTutorialActivity extends Activity {
private MyRequestReceiver receiver;
private Button getInfo;
private EditText countryCode;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//Register your receiver so that the Activity can be notified
//when the JSON response came back
IntentFilter filter = new IntentFilter(MyRequestReceiver.PROCESS_RESPONSE);
filter.addCategory(Intent.CATEGORY_DEFAULT);
receiver = new MyRequestReceiver();
registerReceiver(receiver, filter);
countryCode = (EditText) findViewById(R.id.countryCode);
//button that will trigger the http request
getInfo = (Button) findViewById(R.id.getInfo);
getInfo.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
getCountryInformation();
//hide the soft keyboard
InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.hideSoftInputFromWindow(countryCode.getWindowToken(), 0);
}
});
}
@Override
protected void onDestroy() {
Log.v("AndroidJSONTutorialActivity", "onDestory");
unregisterReceiver(receiver);
super.onDestroy();
}
private void getCountryInformation() {
boolean internet = isNetworkAvailable(this);
if(internet){
String code = countryCode.getText().toString();
//if no country code was entered
if(code.trim().isEmpty()){
Toast toast = Toast.makeText(this, "Please enter a Country Code first!", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.TOP, 105, 50);
toast.show();
}
else {
//pass the request to your service so that it can
//run outside the scope of the main UI thread
Intent msgIntent = new Intent(this, JSONRequest.class);
msgIntent.putExtra(JSONRequest.IN_MSG, "getCountryInfo");
msgIntent.putExtra("countryCode", code.trim());
startService(msgIntent);
}
}
}
//parse and display JSON response
private void displayCountryInformation(String response){
JSONObject responseObj = null;
DecimalFormat df2 = new DecimalFormat("0.00##");
//get references to your views
TextView name = (TextView) findViewById(R.id.name);
TextView continent = (TextView) findViewById(R.id.continent);
TextView region = (TextView) findViewById(R.id.region);
TextView lifeExpectancy = (TextView) findViewById(R.id.lifeExpectancy);
TextView gnp = (TextView) findViewById(R.id.gnp);
TextView surfaceArea = (TextView) findViewById(R.id.surfaceArea);
TextView population = (TextView) findViewById(R.id.population);
TextView errorMessage = (TextView) findViewById(R.id.errorMessage);
try {
//create JSON object from JSON string
responseObj = new JSONObject(response);
//get the success property
boolean success = responseObj.getBoolean("success");
if(success){
Gson gson = new Gson();
//get the country information property
String countryInfo = responseObj.getString("countryInfo");
//create java object from the JSON object
Country country = gson.fromJson(countryInfo, Country.class);
//set values from your country java object
name.setText(country.getName());
continent.setText(country.getContinent());
region.setText(country.getRegion());
lifeExpectancy.setText(df2.format(country.getLifeExpectancy()));
gnp.setText(df2.format(country.getGnp()));
surfaceArea.setText(df2.format(country.getSurfaceArea()));
population.setText(String.valueOf(country.getPopulation()));
errorMessage.setText(" ");
}
else {
name.setText(" ");
continent.setText(" ");
region.setText(" ");
lifeExpectancy.setText(" ");
gnp.setText(" ");
surfaceArea.setText(" ");
population.setText(" ");
errorMessage.setText("Invalid Country Code!");
}
} catch (JSONException e) {
e.printStackTrace();
}
}
//check if you have internet connection
private boolean isNetworkAvailable(Context context) {
ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null) {
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {
Log.w("INTERNET:",String.valueOf(i));
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
Log.w("INTERNET:", "connected!");
return true;
}
}
}
}
return false;
}
//broadcast receiver to receive messages sent from the JSON IntentService
public class MyRequestReceiver extends BroadcastReceiver{
public static final String PROCESS_RESPONSE = "com.as400samplecode.intent.action.PROCESS_RESPONSE";
@Override
public void onReceive(Context context, Intent intent) {
String response = null;
String responseType = intent.getStringExtra(JSONRequest.IN_MSG);
if(responseType.trim().equalsIgnoreCase("getCountryInfo")){
response = intent.getStringExtra(JSONRequest.OUT_MSG);
displayCountryInformation(response);
}
else if(responseType.trim().equalsIgnoreCase("getSomethingElse")){
//you can choose to implement another transaction here
}
}
}
}
Source for Android screen layout main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical">
<LinearLayout android:id="@+id/topLayout"
android:layout_width="match_parent" android:layout_height="220dp"
android:orientation="horizontal">
<RelativeLayout android:layout_height="match_parent"
android:id="@+id/topLeftLayout" android:layout_width="300dp"
android:paddingRight="20dp">
<TextView android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/countryText" android:text="Country Code:"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:textStyle="bold" />
<EditText android:id="@+id/countryCode"
android:layout_height="wrap_content" android:layout_below="@id/countryText"
android:maxLength="3" android:layout_width="75dp">
<requestFocus />
</EditText>
<Button android:text="Get Information" android:layout_height="wrap_content"
android:id="@+id/getInfo" android:layout_below="@id/countryText"
android:layout_toRightOf="@id/countryCode" android:layout_width="wrap_content" />
<TextView android:text=" " android:id="@+id/errorMessage"
android:layout_height="wrap_content" android:layout_below="@id/countryCode"
android:layout_width="match_parent" android:paddingLeft="80dp"
android:textStyle="bold|italic" />
</RelativeLayout>
<LinearLayout android:layout_height="match_parent"
android:id="@+id/rightTopLayout" android:orientation="vertical"
android:layout_width="match_parent">
<TableLayout android:layout_width="match_parent"
android:layout_height="wrap_content" android:id="@+id/tableLayout1"
android:stretchColumns="1,2">
<TableRow android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/tableRow1">
<TextView android:layout_height="wrap_content"
android:text="Name:" android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/textView1" android:layout_width="wrap_content"
android:layout_gravity="right" />
<TextView android:text="" android:id="@+id/name"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="10dp" android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold" />
</TableRow>
<TableRow android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/tableRow2">
<TextView android:layout_height="wrap_content"
android:text="Continent:" android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/textView1" android:layout_width="wrap_content"
android:layout_gravity="right" />
<TextView android:text="" android:id="@+id/continent"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="10dp" android:textAppearance="?android:attr/textAppearanceMedium" />
</TableRow>
<TableRow android:id="@+id/tableRow3" android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView android:layout_height="wrap_content"
android:text="Region:" android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/textView1" android:layout_width="wrap_content"
android:layout_gravity="right" />
<TextView android:text="" android:id="@+id/region"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="10dp" android:textAppearance="?android:attr/textAppearanceMedium" />
</TableRow>
<TableRow android:id="@+id/tableRow4" android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView android:layout_height="wrap_content"
android:text="Life Expectancy:" android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/textView1" android:layout_width="wrap_content"
android:layout_gravity="right" />
<TextView android:text=" " android:id="@+id/lifeExpectancy"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="10dp" android:textAppearance="?android:attr/textAppearanceMedium" />
</TableRow>
<TableRow android:id="@+id/tableRow5" android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView android:layout_height="wrap_content"
android:text="GNP:" android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/textView1" android:layout_width="wrap_content"
android:layout_gravity="right" />
<TextView android:text="" android:id="@+id/gnp"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="10dp" android:textAppearance="?android:attr/textAppearanceMedium" />
</TableRow>
<TableRow android:id="@+id/tableRow6" android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView android:layout_height="wrap_content"
android:text="Surface Area:" android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/textView1" android:layout_width="wrap_content"
android:layout_gravity="right" />
<TextView android:text=" " android:id="@+id/surfaceArea"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="10dp" android:textAppearance="?android:attr/textAppearanceMedium" />
</TableRow>
<TableRow android:id="@+id/tableRow7" android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView android:layout_height="wrap_content"
android:text="Population:" android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/textView1" android:layout_width="wrap_content"
android:layout_gravity="right" />
<TextView android:text=" " android:id="@+id/population"
android:layout_height="wrap_content" android:paddingLeft="10dp"
android:textAppearance="?android:attr/textAppearanceMedium" />
</TableRow>
</TableLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>




No comments:
Post a Comment
NO JUNK, Please try to keep this clean and related to the topic at hand.
Comments are for users to ask questions, collaborate or improve on existing.