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();
}
}
Eh bien, vous exécutez votre AsyncTask une fois. –
Voulez-vous dire que je devrais ajouter une boucle dans le doInBackGround? –