Showing posts with label reverse geocoding. Show all posts
Showing posts with label reverse geocoding. Show all posts

Friday, 18 July 2014

Get Address using Reverse Geocoding and Showing Google Map V2 in Android

Get Address using Reverse Geocoding and ShowingGoogle Map V2 in Android


======================
GPSTracker .java
=======================
public class GPSTracker extends Service implements LocationListener {

private final Context mContext;

// flag for GPS status
boolean isGPSEnabled = false;

// flag for network status
boolean isNetworkEnabled = false;

// flag for GPS status
boolean canGetLocation = false;

Location location; // location
double latitude; // latitude
double longitude; // longitude

// The minimum distance to change Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters

// The minimum time between updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute

// Declaring a Location Manager
protected LocationManager locationManager;

public GPSTracker(Context context) {
this.mContext = context;
getLocation();
}

public Location getLocation() {
try {
locationManager = (LocationManager) mContext
.getSystemService(LOCATION_SERVICE);

// getting GPS status
isGPSEnabled = locationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER);

// getting network status
isNetworkEnabled = locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

if (!isGPSEnabled && !isNetworkEnabled) {
// no network provider is enabled
} else {
this.canGetLocation = true;
if (isNetworkEnabled) {
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
// if GPS Enabled get lat/long using GPS Services
if (isGPSEnabled) {
if (location == null) {
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("GPS Enabled", "GPS Enabled");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
}
}

} catch (Exception e) {
e.printStackTrace();
}

return location;
}

/**
* Stop using GPS listener
* Calling this function will stop using GPS in your app
* */
public void stopUsingGPS(){
if(locationManager != null){
locationManager.removeUpdates(GPSTracker.this);
}
}

/**
* Function to get latitude
* */
public double getLatitude(){
if(location != null){
latitude = location.getLatitude();
}

// return latitude
return latitude;
}

/**
* Function to get longitude
* */
public double getLongitude(){
if(location != null){
longitude = location.getLongitude();
}

// return longitude
return longitude;
}

/**
* Function to check GPS/wifi enabled
* @return boolean
* */
public boolean canGetLocation() {
return this.canGetLocation;
}

/**
* Function to show settings alert dialog
* On pressing Settings button will lauch Settings Options
* */
public void showSettingsAlert(){
AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
   
        // Setting Dialog Title
        alertDialog.setTitle("GPS is settings");

        // Setting Dialog Message
        alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");

        // On pressing Settings button
        alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int which) {
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            mContext.startActivity(intent);
            }
        });

        // on pressing cancel button
        alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
            }
        });

        // Showing Alert Message
        alertDialog.show();
}

@Override
public void onLocationChanged(Location location) {

latitude = location.getLatitude();
longitude = location.getLongitude();
}

@Override
public void onProviderDisabled(String provider) {
}

@Override
public void onProviderEnabled(String provider) {
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}

@Override
public IBinder onBind(Intent arg0) {
return null;
}

}



===================================
ShowAddressGoogleMap .java
==================================
public class ShowAddressGoogleMap extends ActionBarActivity {

GoogleMap googleMap;

GPSTracker gps;

double latitude = 0.0;
double longitude = 0.0;

private TextView tvAddress;
private Button btnSave;
private ProgressBar mActivityIndicator;

String addressText;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.showaddressmap);
tvAddress = (TextView) findViewById(R.id.tvAddress);

btnSave = (Button) findViewById(R.id.btnSave);
mActivityIndicator = (ProgressBar) findViewById(R.id.address_progress);
mActivityIndicator.setVisibility(View.GONE);

try {
// Loading map
initilizeMap();

} catch (Exception e) {
e.printStackTrace();
}

setLocation();

btnSave.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {

UIUtils.showToast(getApplicationContext(), ""+addressText);

}
});

}

private void setLocation() {
// TODO Auto-generated method stub
gps = new GPSTracker(this);
// check if GPS enabled
if (gps.canGetLocation()) {

latitude = gps.getLatitude();
longitude = gps.getLongitude();

// \n is for new line
/*
* Toast.makeText( getApplicationContext(),
* "Your Location is - \nLat: " + latitude + "\nLong: " + longitude,
* Toast.LENGTH_LONG).show();
*/

showGoogleMap();

getAddress();
} else {
// can't get location
// GPS or Network is not enabled
// Ask user to enable GPS/network in settings
gps.showSettingsAlert();
}
}

@SuppressLint("NewApi")
public void getAddress() {
// Ensure that a Geocoder services is available
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD
&& Geocoder.isPresent()) {
// Show the activity indicator

/*
* Reverse geocoding is long-running and synchronous. Run it on a
* background thread. Pass the current location to the background
* task. When the task finishes, onPostExecute() displays the
* address.
*/

if (gps.canGetLocation() && gps.isNetworkEnabled) {

(new GetAddressTask(this)).execute(gps.getLocation());
}
else
{
tvAddress.setText("No Internet Connection");
}

}

}

private void showGoogleMap() {

int status = GooglePlayServicesUtil
.isGooglePlayServicesAvailable(getBaseContext());

// Showing status
if (status != ConnectionResult.SUCCESS) {
// Google Play Services are not available

int requestCode = 10;
Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this,
requestCode);
dialog.show();

} else {

// googleMap.setMyLocationEnabled(true);

LatLng currentposition = null;
currentposition = new LatLng(latitude, longitude);

// position1

MarkerOptions markerOptions1 = new MarkerOptions();
markerOptions1.position(currentposition);

markerOptions1.title("Your Location");
markerOptions1.snippet("Lat: " + latitude + ", Lng: " + longitude);
markerOptions1.icon(BitmapDescriptorFactory
.fromResource(R.drawable.ic_launcher));

googleMap.addMarker(markerOptions1);

googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
currentposition, 15));

googleMap.animateCamera(CameraUpdateFactory.zoomTo(15), 2000, null);

}

}

/**
* function to load map. If map is not created it will create it for you
* */
private void initilizeMap() {
if (googleMap == null) {
SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
googleMap = fm.getMap();

// check if map is created successfully or not
if (googleMap == null) {
Toast.makeText(getApplicationContext(),
"Sorry! unable to create maps", Toast.LENGTH_SHORT)
.show();
}
}
}

@Override
protected void onResume() {
super.onResume();
initilizeMap();
}

public class GetAddressTask extends AsyncTask<Location, Void, String> {
Context mContext;

public GetAddressTask(Context context) {
super();
mContext = context;
}

/**
* Get a Geocoder instance, get the latitude and longitude look up the
* address, and return it
*
* @params params One or more Location objects
* @return A string containing the address of the current location, or
*         an empty string if no address can be found, or an error
*         message
*/
@Override
protected String doInBackground(Location... params) {
mActivityIndicator.setVisibility(View.VISIBLE);
Geocoder geocoder = new Geocoder(mContext, Locale.getDefault());
// Get the current location from the input parameter list
Location loc = params[0];
// Create a list to contain the result address
List<Address> addresses = null;
try {
/*
* Return 1 address.
*/
addresses = geocoder.getFromLocation(loc.getLatitude(),
loc.getLongitude(), 1);
} catch (IOException e1) {
Log.e("LocationSampleActivity",
"IO Exception in getFromLocation()");
e1.printStackTrace();
return ("IO Exception trying to get address");
} catch (IllegalArgumentException e2) {
// Error message to post in the log
String errorString = "Illegal arguments "
+ Double.toString(loc.getLatitude()) + " , "
+ Double.toString(loc.getLongitude())
+ " passed to address service";
Log.e("LocationSampleActivity", errorString);
e2.printStackTrace();
return errorString;
}
// If the reverse geocode returned an address
if (addresses != null && addresses.size() > 0) {
// Get the first address
Address address = addresses.get(0);
/*
* Format the first line of address (if available), city, and
* country name.
*/

addressText = String.format(
"%s, %s, %s, %s ",
// If there's a street address, add it
address.getMaxAddressLineIndex() > 0 ? address
.getAddressLine(0) : "", address
.getAddressLine(1), address.getAddressLine(2), // Locality
// is
// usually
// a
// city

// The country of the address
address.getCountryName());
// Return the text
return addressText;
} else {
return "No address found";
}
}

@Override
protected void onPostExecute(String address) {
// Set activity indicator visibility to "gone"
mActivityIndicator.setVisibility(View.GONE);
// Display the results of the lookup.
tvAddress.setText(address);
}
}
}

=======================
XML Layout file
========================
<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" >

    <fragment
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="8.5"
        class="com.google.android.gms.maps.SupportMapFragment" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:orientation="horizontal"
       
        android:background="#C9C9C9"
        >

        <TextView
            android:id="@+id/tvAddress"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Address :"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <Button
            android:id="@+id/btnSave"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:text="Save" />

        <ProgressBar
            android:id="@+id/address_progress"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true" />

    </RelativeLayout>

</LinearLayout>


======================
AndroidManifest file
=====================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.your.app"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <permission
        android:name="com.infodat.trackme.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

  
    <!-- for maps -->

    <uses-permission android:name="com.infodat.trackme.permission.MAPS_RECEIVE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
               
          <activity
            android:name="com.your.app.ShowAddressGoogleMap"
            android:label="@string/app_name" >
          <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
      

        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="your key" />
    </application>

</manifest>