Monday, March 21, 2016

GPS tracking code in Android

First I have a class called GPSTracker that handles all the functionality related to location tracking.


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
package com.example.gpstracking;

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;

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) {
 }

 @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;
 }

}
Now comes my android activity
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.example.gpstracking;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class AndroidGPSTrackingActivity extends Activity {
 
 Button btnShowLocation;
 
 // GPSTracker class
 GPSTracker gps;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        btnShowLocation = (Button) findViewById(R.id.btnShowLocation);
        
        // show location button click event
        btnShowLocation.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View arg0) {  
    // create class object
          gps = new GPSTracker(AndroidGPSTrackingActivity.this);

    // check if GPS enabled  
          if(gps.canGetLocation()){
           
           double latitude = gps.getLatitude();
           double longitude = gps.getLongitude();
           
           // \n is for new line
           Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show(); 
          }else{
           // can't get location
           // GPS or Network is not enabled
           // Ask user to enable GPS/network in settings
           gps.showSettingsAlert();
          }
    
   }
  });
    }
    
}
Now comes my layout, main.xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    
    <Button android:id="@+id/btnShowLocation" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Show Location"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"/>

</RelativeLayout>
Finally, this is my android manifest
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.gpstracking"
    android:versionCode="1"
    android:versionName="1.0" >

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

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".AndroidGPSTrackingActivity"
            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>
    
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
 <uses-permission android:name="android.permission.INTERNET" />

</manifest>

No comments:

Post a Comment