0

Cela fait longtemps que je n'arrive pas à résoudre ce problème.Localisation instantanée dans AsyncTask avec LocationListener et HttpUrlConnection poste données

J'ai un AsyncTask qui reçoit toutes les 20s l'emplacement réseau de l'utilisateur et publie les données sur un serveur distant.

Je autorisations demandées comme indiqué appartiennent

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

Voici le OnCreate() du MainActivitiy et le reste du code

public class TraficMain extends AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 
     setContentView(R.layout.activity_main); 

     new UrlPositionAsynck().execute(); 
    } 

    private class UrlPositionAsynck extends AsyncTask<Void, Void , String> { 

     public double longitude, latitude; 
     public URL url; 
     protected LocationManager locationManager; 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
     } 

     @Override 
     protected String doInBackground(Void... urlink) { 

      GPSPosition gpsPosition = new GPSPosition(TraficMain.this); 

      locationManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE); 
      locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 20000, 0, gpsPosition); 

      Position position = gpsPosition.getPosition(); 

      String params= "lb_lo=" + position.getLb_longitude() + "&lb_la=" + position.getLb_latitude(); 

      try { 
       url = new URL("http://myremote_url"); 
       byte[] param=params.getBytes("UTF-8"); 
       int postLength=param.length; 
       HttpURLConnection strConn = (HttpURLConnection) url.openConnection(); 
       strConn.setDoOutput(true); 
       strConn.setInstanceFollowRedirects(false); 
       strConn.setRequestMethod("POST"); 
       strConn.setConnectTimeout(60000); 
       strConn.setChunkedStreamingMode(0); 
       strConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
       strConn.setRequestProperty("charset", "utf-8"); 
       strConn.setRequestProperty("Content-Length", Integer.toString(postLength)); 
       strConn.setUseCaches(false); 
       OutputStream out=strConn.getOutputStream(); 
       BufferedWriter data =new BufferedWriter(new OutputStreamWriter(strConn.getOutputStream())); 
       data.write(params); 
       data.flush(); 
       data.close(); 
       out.flush(); 
       out.close(); 

       BufferedReader br = new BufferedReader(new InputStreamReader((strConn.getInputStream()))); 
       StringBuilder sb = new StringBuilder(); 
       String output; 
       while ((output = br.readLine()) != null) { 
        sb.append(output); 
       } 
      }catch(IOException io){ 
       Log.i("Connection Problem :", io.getMessage()); 
      } 

      return null; 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 
    } 
} 

Et j'obtenir l'emplacement de cette classe qui implémente LocationListener

public class GPSPosition implements LocationListener{ 

    Activity myContext; 
    public double longitude, latitude; 

    public GPSPosition(Activity context){ 
     this.myContext=context; 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     longitude = location.getLongitude(); 
     latitude = location.getLatitude(); 

     TextView txt = (TextView) this.myContext.findViewById(R.id.txtPosition); 
     txt.setText(longitude + ", " + latitude); 
    } 

    @Override 
    public void onProviderDisabled(String provider) {} 

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

    @Override 
    public void onProviderEnabled(String provider) {} 

    public Position getPosition(){ 
     return new Position(this.longitude, this.latitude); 
    } 

Mon problème avec ce code. Je publie seulement des données quand l'application est lancée et la latitude et la longitude sont toujours égales à 0.

Je m'attendais à avoir des données publiées sur le serveur distant toutes les 20 secondes. Quelqu'un peut-il dire comment gérer cela à résoudre? J'ai passé tout le week-end

EDIT Ceci est le nouveau code de l'onCreate(). Même si l'appareil change de position, la valeur de l'emplacement reste inchangée et je ne sais pas vraiment pourquoi cela se produit.

protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
    setContentView(R.layout.activity_main); 

    final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      final GPSPosition gpsPosition = new GPSPosition(TraficMain.this); 

      locationManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE); 
      locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, gpsPosition); 
      new UrlPositionAsynck().execute(gpsPosition.getPosition()); 
     } 
    }, 20000); 
} 

private class UrlPositionAsynck extends AsyncTask<Position, Void , String> { 
    public double longitude, latitude; 
    public URL url; 
    protected LocationManager locationManager; 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
    } 

    @Override 
    protected String doInBackground(Position... urlink) { 

     Position position = urlink[0]; 

     String params= "lb_lo=" + position.getLb_longitude() + "&lb_la=" + position.getLb_latitude(); 

     try { 
      url = new URL("http://remote_url"); 
      byte[] param=params.getBytes("UTF-8"); 
      int postLength=param.length; 
      HttpURLConnection strConn = (HttpURLConnection) url.openConnection(); 
      strConn.setDoOutput(true); 
      strConn.setInstanceFollowRedirects(false); 
      strConn.setRequestMethod("POST"); 
      strConn.setConnectTimeout(60000); 
      strConn.setChunkedStreamingMode(0); 
      strConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
      strConn.setRequestProperty("charset", "utf-8"); 
      strConn.setRequestProperty("Content-Length", Integer.toString(postLength)); 
      strConn.setUseCaches(false); 

      OutputStream out=strConn.getOutputStream(); 
      BufferedWriter data =new BufferedWriter(new OutputStreamWriter(strConn.getOutputStream())); 
      data.write(params); 
      data.flush(); 
      data.close(); 
      out.flush(); 
      out.close(); 

      BufferedReader br = new BufferedReader(new InputStreamReader((strConn.getInputStream()))); 
      StringBuilder sb = new StringBuilder(); 
      String output; 
      while ((output = br.readLine()) != null) { 
       sb.append(output); 
      } 
     }catch(IOException io){ 
      io.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 
} 
+0

Eh bien, vous exécutez votre AsyncTask une fois. –

+0

Voulez-vous dire que je devrais ajouter une boucle dans le doInBackGround? –

Répondre

0

Vous pouvez faire un gestionnaire et exécuter toutes les 20 secondes en faisant quelque chose comme ça

final Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
new UrlPositionAsynck().execute(); 
     //Do something after 20 seconds 
     handler.postDelayed(this, 20000); 
    } 
}, 1000); 
+0

Cette paix de code a été utile. Je peux me connecter à la télécommande mais le problème n'est toujours pas résolu. La valeur des positions est inchangée –

+0

Il vous manque l'autorisation de localisation grossière dans le manifeste –