これはしばらくしてこの問題を解決するようになっています。LocationListenerとHttpUrlConnectionポストデータを使用したAsyncTaskのインスタントロケーション
私はAsyncTaskを持っています。このAsyncTaskは、ユーザーのネットワークロケーションを20秒ごとに取得し、リモートサーバーにデータを送信します。
<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" />
属し示すように、私はここでMainActivitiyのOnCreate関数()とコード
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();
}
}
}
の残りの部分があるの権限を要求してきたと私はその実装このクラスで場所を取得します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);
}
このコードに問題があります。私はアプリが起動され、緯度と経度が常に0に等しいときにのみデータをポストします。
私は20秒ごとにリモートサーバーにデータを投稿することを期待していました。 誰かがこれを解決する方法を教えてもらえますか?私は週末を過ごしています
編集 これはonCreate()の新しいコードです。 デバイスが位置を変更したとしても、位置の値は変更されず、なぜこれが起こっているのか分かりません。
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();
}
}
ような何かを行うことによって、ハンドラを作成し、すべての20秒後にそれを実行することができます。 –
doInBackGroundの中にLoopを追加する必要があるのですか? –