This is a simple Android app that uses two activities. This app uses Google Maps API.
- Download Android studio and install
- Create a new blank activity - this is the launcher activity
- Login to google and enable Maps API by providing SHA-1 value of your client
- C:\Users\xyz>keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android
- Register ssh-1 key in google API console along with application package name
- Get the key and save it in android manifest
- Launcher activity creates a new private class that extends AsyncTask
- This class is responsible to call the API to retrieve JSON rest call
- JSON output is parsed and we only retrieve few values we needed from the json hierarchy
- There is a second button that invokes a MapsActivity when clicked by passing latitude and longitude via intent
- This app uses free http://api.openweathermap.org weather API
Important file contents
<resources>
    <string name="google_maps_key_instructions" templateMergeStrategy="replace">
    <string name="google_maps_key" templateMergeStrategy="preserve">GoogleAPIKeyHere</string>
</resources>
package com.example.xyz.myapplication;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
public class MainActivity3 extends ActionBarActivity  implements View.OnClickListener {
    public static final String RESTAPI_URL = "http://api.openweathermap.org/data/2.5/weather?q=";
    public static final String UNITS = "&units=metric";
    EditText result;
    EditText cityCountry;
    ProgressBar pb;
    Button button;
    String longitude;
    String latitude;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_activity3);
        pb = (ProgressBar) findViewById(R.id.progressBar2);
        pb.setVisibility(View.GONE);
        button = (Button) findViewById(R.id.show);
        button.setOnClickListener(this);
        Button mapButton = (Button) findViewById(R.id.showMap);
        mapButton.setOnClickListener(this);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main_activity3, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
    @Override
    public void onClick(View v) {
        if( v.getId() ==  R.id.showMap ) {
            Intent intent = new Intent(this, MapsActivity.class);
            intent.putExtra("lat", Double.parseDouble(latitude));
            intent.putExtra("long", Double.parseDouble(longitude));
            startActivity(intent);
        }
        //else
            result = (EditText)findViewById(R.id.result);
            cityCountry = (EditText)findViewById(R.id.cityCountry);
            pb = (ProgressBar) findViewById(R.id.progressBar2);
            pb.setVisibility(View.VISIBLE);
            //call web service
            AsyncTaskService service = new AsyncTaskService();
            service.execute(cityCountry.getText().toString());
    }
    private class AsyncTaskService extends AsyncTask<String, Integer, String> {
        String jSonContent;
        String resultToDisplay;
        @Override
        protected String doInBackground(String... params) {
            postData(params[0]);
            return null;
        }
        protected void onPostExecute(String serviceResult){
            pb.setVisibility(View.GONE);
            result.setText(resultToDisplay);
        }
        protected void onProgressUpdate(Integer... progress){
            pb.setProgress(progress[0]);
        }
        public void postData(String valueIWantToSend) {
            // HTTP Get
            BufferedReader reader = null;
            try {
                URL url = new URL(RESTAPI_URL+valueIWantToSend+UNITS);
                StringBuilder sb = new StringBuilder();
                String line = null;
                reader = new BufferedReader(new InputStreamReader(url.openConnection().getInputStream()));
                // Read Server Response
                while((line = reader.readLine()) != null)
                {
                    // Append server response in string
                    sb.append(line + "");
                    System.out.println("Response:"+ line);
                }
                // Append Server Response To Content String
                jSonContent = sb.toString();
                parseJson(jSonContent);
            } catch (Exception e ) {
                System.out.println(e.getMessage());
            }
        }
        private void parseJson(String rawJson) {
            JSONObject jsonResponse;
            StringBuffer sb = new StringBuffer();
            try {
                jsonResponse = new JSONObject(rawJson);
                JSONObject coord = jsonResponse.getJSONObject("coord");
                longitude = coord.getString("lon");
                latitude = coord.getString("lat");
                sb.append("Latitude:" + latitude);
                sb.append("\nLongitude:" + longitude);
                JSONObject sys = jsonResponse.getJSONObject("sys");
                String countryCode = sys.getString("country");
                sb.append("\nCountry Code:" + countryCode);
                JSONObject main = jsonResponse.getJSONObject("main");
                String minTemp = main.getString("temp_min");
                String maxTemp = main.getString("temp_max");
                sb.append("\nMin Temp:" + minTemp);
                sb.append("\nMax Temp:" + maxTemp);
                String cityName = jsonResponse.getString("name");
                sb.append("\nCity Name:" + cityName);
                resultToDisplay = sb.toString();
            } catch (Exception e ) {
            }
        }
    }
}
public class MapsActivity extends FragmentActivity {
    private GoogleMap mMap; // Might be null if Google Play services APK is not available.
    double latitude;
    double longitude;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        Intent intent = getIntent();
        latitude = intent.getDoubleExtra("lat", 0);
        longitude = intent.getDoubleExtra("long", 0);
        System.out.println("******Latitude"+latitude);
        System.out.println("******Longitude:"+longitude);
        setUpMapIfNeeded();
        mMap.setMyLocationEnabled(true);
    }
    @Override
    protected void onResume() {
        super.onResume();
        setUpMapIfNeeded();
    }
    /**
     * Sets up the map if it is possible to do so (i.e., the Google Play services APK is correctly
     * installed) and the map has not already been instantiated.. This will ensure that we only ever
     * call {@link #setUpMap()} once when {@link #mMap} is not null.
     * <p/>
     * If it isn't installed {@link SupportMapFragment} (and
     * {@link com.google.android.gms.maps.MapView MapView}) will show a prompt for the user to
     * install/update the Google Play services APK on their device.
     * <p/>
     * A user can return to this FragmentActivity after following the prompt and correctly
     * installing/updating/enabling the Google Play services. Since the FragmentActivity may not
     * have been completely destroyed during this process (it is likely that it would only be
     * stopped or paused), {@link #onCreate(Bundle)} may not be called again so we should call this
     * method in {@link #onResume()} to guarantee that it will be called.
     */
    private void setUpMapIfNeeded() {
        // Do a null check to confirm that we have not already instantiated the map.
        if (mMap == null) {
            // Try to obtain the map from the SupportMapFragment.
            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                    .getMap();
            // Check if we were successful in obtaining the map.
            if (mMap != null) {
                setUpMap();
            }
        }
    }
    /**
     * This is where we can add markers or lines, add listeners or move the camera. In this case, we
     * just add a marker near Africa.
     * <p/>
     * This should only be called once and when we are sure that {@link #mMap} is not null.
     */
    private void setUpMap() {
        //mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
        LatLng position = new LatLng(latitude, longitude);
        // create marker
        MarkerOptions marker = new MarkerOptions().position(position).title("Hello Maps ");
        // adding marker
        mMap.addMarker(marker);
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(position, 4));
    }
}
 
 
No comments:
Post a Comment