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();
}
}
wohlauf Sie Ihre AsyncTask einmal ausgeführt werden. –
Meinst du, ich sollte eine while-Schleife innerhalb der DoInBackGround hinzufügen? –