11package com .voxlearning .androidtcpdumpgui ;
22
3+ import android .Manifest ;
34import android .app .AlarmManager ;
45import android .app .PendingIntent ;
56import android .app .Service ;
67import android .content .Context ;
8+ import android .content .DialogInterface ;
79import android .content .Intent ;
10+ import android .content .pm .PackageManager ;
11+ import android .location .Location ;
12+ import android .location .LocationListener ;
13+ import android .location .LocationManager ;
14+ import android .os .Bundle ;
815import android .os .Handler ;
916import android .os .IBinder ;
1017import android .os .Message ;
1118import android .os .SystemClock ;
19+ import android .provider .Settings ;
20+ import android .support .v4 .app .ActivityCompat ;
21+ import android .support .v7 .app .AlertDialog ;
1222import android .util .Log ;
1323
14- public class CaptureService extends Service {
24+ public class CaptureService extends Service implements LocationListener {
1525
1626 static private final String TAG = "CaptureService" ;
1727
@@ -23,6 +33,7 @@ public class CaptureService extends Service {
2333
2434 private CaptureManager mCaptureManager ;
2535 private AlarmManager mAlarmManager ;
36+ private LocationManager mLocationManager ;
2637
2738 static final public int AlarmInterval_RestartService = 30 * 1000 ;
2839 static final public int DelayInterval_PeriodWork = 5 * 1000 ;
@@ -33,21 +44,21 @@ public class CaptureService extends Service {
3344 public void onCreate () {
3445 mCaptureManager = new CaptureManager ();
3546 mAlarmManager = (AlarmManager ) getSystemService (Context .ALARM_SERVICE );
47+ mLocationManager = (LocationManager ) getSystemService (LOCATION_SERVICE );
48+ gpsStart ();
3649 }
3750
3851 @ Override
3952 public int onStartCommand (Intent intent , int flags , int startId ) {
4053
4154 if (intent != null ) {
42- if (ServiceAction_CaptureStart .equals (intent .getAction ())) {
55+ if (ServiceAction_CaptureStart .equals (intent .getAction ())) {
4356 Log .d (TAG , "capture start" );
4457 periodWork ();
45- }
46- else if (ServiceAction_PeriodWork .equals (intent .getAction ())) {
58+ } else if (ServiceAction_PeriodWork .equals (intent .getAction ())) {
4759 Log .d (TAG , "period work" );
4860 periodWork ();
49- }
50- else if (ServiceAction_CaptureStop .equals (intent .getAction ())) {
61+ } else if (ServiceAction_CaptureStop .equals (intent .getAction ())) {
5162 Log .d (TAG , "capture stop" );
5263 stopSelf ();
5364 }
@@ -65,6 +76,67 @@ public IBinder onBind(Intent intent) {
6576 return null ;
6677 }
6778
79+
80+
81+
82+ private static final long GPS_MIN_DISTANCE_UPDATE = 10 ; // The minimum distance to change Updates in meters
83+ private static final long GPS_MIN_DURATION_UPDATE = 30 * 1000 ; // The minimum time between updates in milliseconds
84+
85+ @ Override
86+ public void onLocationChanged (Location location ) {
87+ mCaptureManager .recordGps (location );
88+ }
89+
90+ @ Override
91+ public void onStatusChanged (String provider , int status , Bundle extras ) {
92+ mCaptureManager .recordLog ("gps status changed: provider=" + provider + ", status=" + status );
93+ }
94+
95+ @ Override
96+ public void onProviderEnabled (String provider ) {
97+ gpsStop ();
98+ gpsStart ();
99+ }
100+
101+ @ Override
102+ public void onProviderDisabled (String provider ) {
103+ gpsStop ();
104+ gpsStart ();
105+ }
106+
107+ public void gpsStart () {
108+ if (ActivityCompat .checkSelfPermission (this , Manifest .permission .ACCESS_FINE_LOCATION ) != PackageManager .PERMISSION_GRANTED && ActivityCompat .checkSelfPermission (this , Manifest .permission .ACCESS_COARSE_LOCATION ) != PackageManager .PERMISSION_GRANTED ) {
109+ return ;
110+ }
111+
112+ if (mLocationManager .isProviderEnabled (LocationManager .GPS_PROVIDER )) {
113+
114+ mCaptureManager .recordLog ("gps start with last known location:" + LocationManager .GPS_PROVIDER );
115+ mCaptureManager .recordGps (mLocationManager .getLastKnownLocation (LocationManager .GPS_PROVIDER ));
116+ mLocationManager .requestLocationUpdates (LocationManager .GPS_PROVIDER , GPS_MIN_DURATION_UPDATE , GPS_MIN_DISTANCE_UPDATE , this );
117+
118+ } else if (mLocationManager .isProviderEnabled (LocationManager .NETWORK_PROVIDER )) {
119+
120+ mCaptureManager .recordLog ("gps start with last known location:" + LocationManager .NETWORK_PROVIDER );
121+ mCaptureManager .recordGps (mLocationManager .getLastKnownLocation (LocationManager .NETWORK_PROVIDER ));
122+ mLocationManager .requestLocationUpdates (LocationManager .NETWORK_PROVIDER , GPS_MIN_DURATION_UPDATE , GPS_MIN_DISTANCE_UPDATE , this );
123+
124+ }
125+ }
126+
127+ public void gpsStop () {
128+ if (ActivityCompat .checkSelfPermission (this , Manifest .permission .ACCESS_FINE_LOCATION ) != PackageManager .PERMISSION_GRANTED && ActivityCompat .checkSelfPermission (this , Manifest .permission .ACCESS_COARSE_LOCATION ) != PackageManager .PERMISSION_GRANTED ) {
129+ return ;
130+ }
131+
132+ mCaptureManager .recordLog ("gps stop" );
133+ mLocationManager .removeUpdates (this );
134+ }
135+
136+
137+
138+
139+
68140 static public class PeriodWorkHandler extends Handler {
69141
70142 private Context mContext ;
0 commit comments