0

I am new in using background service and retrofit library, i am getting no error, by debugging my app i come to know that its getting coordinates but not sending to server(in background service) Any help will appreciated, thanks in advance, happy coding!

GPS Service

public class LocationUpdaterService extends Service
{
    public static final int TWO_MINUTES = 120000; // 120 seconds
    public static Boolean isRunning = false;

    public LocationManager mLocationManager;
    public LocationUpdaterListener mLocationListener;
    public Location previousBestLocation = null;

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

    @Override
    public void onCreate() {
        mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        mLocationListener = new LocationUpdaterListener();
        super.onCreate();
    }

    Handler mHandler = new Handler();
    Runnable mHandlerTask = new Runnable(){
        @Override
        public void run() {
            if (!isRunning) {
                startListening();
            }
            mHandler.postDelayed(mHandlerTask, TWO_MINUTES);
        }
    };

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        mHandlerTask.run();
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        stopListening();
        mHandler.removeCallbacks(mHandlerTask);
        super.onDestroy();
    }

    private void startListening() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            if (mLocationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER))
                mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, mLocationListener);

            if (mLocationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER))
                mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener);
        }
        isRunning = true;
    }

    private void stopListening() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            mLocationManager.removeUpdates(mLocationListener);
        }
        isRunning = false;
    }

    public class LocationUpdaterListener implements LocationListener
    {
        @Override
        public void onLocationChanged(Location location) {
            if (isBetterLocation(location, previousBestLocation)) {
                previousBestLocation = location;
                try {
                    // Script to post location data to server..

                    Call<Update> loginCall;
                    String deviceKey;

                    deviceKey = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);

                    loginCall = MyApplication.getInstance().getAPI().update(deviceKey,String.valueOf(location.getLatitude()),String.valueOf(location.getLongitude()));
                    loginCall.enqueue(new Callback<Update>() {
                        @Override
                        public void onResponse(Call<Update> call, Response<Update> response) {
                            if(response.getClass() != null)
                            {

                            }
                        }

                        @Override
                        public void onFailure(Call<Update> call, Throwable t) {

                        }

                    });

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

        @Override
        public void onProviderDisabled(String provider) {
            stopListening();
        }

        @Override
        public void onProviderEnabled(String provider) { }

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

    protected boolean isBetterLocation(Location location, Location currentBestLocation) {
        if (currentBestLocation == null) {
            // A new location is always better than no location
            return true;
        }

        // Check whether the new location fix is newer or older
        long timeDelta = location.getTime() - currentBestLocation.getTime();
        boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
        boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
        boolean isNewer = timeDelta > 0;

        // If it's been more than two minutes since the current location, use the new location
        // because the user has likely moved
        if (isSignificantlyNewer) {
            return true;
            // If the new location is more than two minutes older, it must be worse
        } else if (isSignificantlyOlder) {
            return false;
        }

        // Check whether the new location fix is more or less accurate
        int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());
        boolean isLessAccurate = accuracyDelta > 0;
        boolean isMoreAccurate = accuracyDelta < 0;
        boolean isSignificantlyLessAccurate = accuracyDelta > 200;

        // Check if the old and new location are from the same provider
        boolean isFromSameProvider = isSameProvider(location.getProvider(), currentBestLocation.getProvider());

        // Determine location quality using a combination of timeliness and accuracy
        if (isMoreAccurate) {
            return true;
        } else if (isNewer && !isLessAccurate) {
            return true;
        } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
            return true;
        }
        return false;
    }

    /** Checks whether two providers are the same */
    private boolean isSameProvider(String provider1, String provider2) {
        if (provider1 == null) {
            return provider2 == null;
        }
        return provider1.equals(provider2);
    }

My Application

import android.app.Application;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class MyApplication extends Application {
    private API api;
    private OkHttpClient client;
    private static MyApplication sInstance;

    @Override
    public void onCreate() {
        super.onCreate();
        sInstance = this;
        configureAPI();

    }

    private void configureAPI() {
        client = new OkHttpClient.Builder()
                .connectTimeout(80, TimeUnit.SECONDS)
                .writeTimeout(300, TimeUnit.SECONDS)
                .readTimeout(80, TimeUnit.SECONDS)
                .build();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Server.API_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build();
        api = retrofit.create(API.class);
    }

    public API getAPI() {
        return api;
    }

    public static MyApplication getInstance() {
        return sInstance;
    }
}

API

public interface API {
    @FormUrlEncoded
    @POST("updateLocation")
    Call<Update> update(@Query("token") String token, @Query("lat") String latitude, @Field("long") String longitude);

}

Server

public class Server {
    public static final String API_URL = "http://192.168.146.2:8090/";
    public static final String REG_API_URL = "http://192.168.120.2:8090/";
    public static final String SndMsg_API_URL = "http://192.168.120.2:8090/";

}

MainActivity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent serviceIntent = new Intent(getApplicationContext(), LocationUpdaterService.class);
        startService(serviceIntent);

    }
}
Kohei TAMURA
  • 4,970
  • 7
  • 25
  • 49
M. Adil
  • 180
  • 1
  • 11

1 Answers1

1

Your code looks pretty good. There are few things those might be causing problems. please check those.

First of all make sure compiler is going inside the "OnLocationChanged()" method.

Second thing make sure your web-service call method is of "Update" type. Because you are using "Update". It can be "Post".

Third thing is print the response in "OnFailure()" method, maybe it is going to failure.

I hope you will find the problem by checking these scenarios.

Zohaib Hassan
  • 984
  • 2
  • 7
  • 11
  • i have debugged the code! its not going inside loginCall.enqueue(new Callback() { public void onResponse(Call call, Response response) { } } public void onFailure(Call call, Throwable t) { } }); – M. Adil May 09 '17 at 23:04
  • 1
    Maybe the problem is you have declared your method as "Update" method. But it might be "Post". Please check that as well. – Zohaib Hassan May 09 '17 at 23:11
  • No its post and i'm using post – M. Adil May 09 '17 at 23:18
  • 1
    public interface API { @FormUrlEncoded @POST("updateLocation") Call update(@Query("token") String token, @Query("lat") String latitude, @Field("long") String longitude); } I can see "Update" here in Call – Zohaib Hassan May 09 '17 at 23:20
  • this is model class name "Update" but i am using @post method – M. Adil May 09 '17 at 23:27
  • Add "OKHttpLoggingInspector" to your code, it will help you to get the exact problem. Check this link below: http://stackoverflow.com/questions/32514410/logging-with-retrofit-2 – Zohaib Hassan May 10 '17 at 21:12