2017-05-09 5 views
0

Je suis nouveau dans l'utilisation du fond de service et de la bibliothèque retrofit, je ne reçois aucune erreur, en déboguant mon application je viens de savoir que ses coordonnées obtenir mais pas envoi au serveur (en arrière-plan) Toute aide sera appréciée, merci d'avance, bonne codification!Mettre à jour l'emplacement GPS et envoyer les coordonnées au serveur (en arrière-plan) en utilisant la bibliothèque retrofit

Service GPS

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

Mon 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); 

} 

serveur

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); 

    } 
} 

Répondre

1

Votre code semble assez bon. Il y a peu de choses qui pourraient causer des problèmes. s'il vous plaît vérifier ceux. Tout d'abord, assurez-vous que le compilateur va dans la méthode "OnLocationChanged()" (0).

Vérifiez en second lieu que votre méthode d'appel de service Web est de type "Update". Parce que vous utilisez "Update". Cela peut être "Post".

La troisième chose est d'imprimer la réponse dans la méthode "OnFailure()", peut-être qu'elle va échouer.

J'espère que vous trouverez le problème en vérifiant ces scénarios.

+0

J'ai débogué le code! sa ne va pas à l'intérieur loginCall.enqueue (nouveau rappel () { onResponse public void (Appel appel, réponse Réponse ) { }} onFailure public void (appel appel, Throwable t) { } }); –

+1

Peut-être que le problème est que vous avez déclaré votre méthode comme méthode de "mise à jour". Mais ce pourrait être "Post". Veuillez vérifier cela aussi. –

+0

Pas de son poste et je l'utilise après –