0

Es ist eine Weile her, dass ich dieses Problem lösen muss.Sofortiger Speicherort in AsyncTask mit LocationListener und HttpUrlConnection Postdaten

Ich habe eine AsyncTask, die alle 20s den Netzwerkstandort des Benutzers erhält und die Daten an einen Remote-Server sendet.

Ich habe Berechtigungen angefordert, wie gezeigt, gehören

<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" /> 

Hier ist die OnCreate() der MainActivitiy und der Rest des Codes

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

Und ich bekomme den Standort mit dieser Klasse, die implementiert 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); 
    } 

Mein Problem mit diesem Code. Ich poste nur Daten, wenn die App gestartet wird und die Breite und Länge immer gleich 0 sind.

Ich hatte erwartet, Daten alle 20 Sekunden auf dem Remote-Server veröffentlicht zu haben. Kann jemand sagen, wie man das handhabt, um es zu lösen? Ich habe das ganze Wochenende verbracht

EDIT Dies ist der neue Code der onCreate(). Auch wenn das Gerät die Position ändert, ist der Wert des Ortes unverändert und ich weiß nicht wirklich warum das passiert.

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

wohlauf Sie Ihre AsyncTask einmal ausgeführt werden. –

+0

Meinst du, ich sollte eine while-Schleife innerhalb der DoInBackGround hinzufügen? –

Antwort

0

Sie können einen Handler machen und es nach 20 Sekunden laufen, um so etwas wie dieses

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

Dieser Code-Code war hilfreich. Ich kann mich mit der Fernbedienung verbinden, aber das Problem ist immer noch nicht gelöst. Der Wert der Positionen ist unverändert –

+0

Sie fehlen Zugriff Grobstandort Berechtigung in Manifest –